當前位置:首頁 » 編程軟體 » 安卓編譯insmod

安卓編譯insmod

發布時間: 2022-12-12 17:25:39

⑴ insmod使用詳解

linux指令:insmod——載入模塊
insmod 就是install mole的縮寫
功能說明:載入模塊。
語法:insmod [-fkmpsvxX][-o <模塊名稱>][模塊文件][符號名稱 = 符號值]
說明:Linux有許多功能是通過模塊的方式,在需要時才載入kernel。如此可使kernel較為精簡,進而提高效率,以及保有較大的彈性。這類可載入的模塊,通常是設備驅動程序。

參數:
-f 不檢查目前kernel版本與模塊編譯時的kernel版本是否一致,強制將模塊載入。
-k 將模塊設置為自動卸除。
-m 輸出模塊的載入信息。
-o<模塊名稱> 指定模塊的名稱,可使用模塊文件的文件名。
-p 測試模塊是否能正確地載入kernel。
-s 將所有信息記錄在系統記錄文件中。
-v 執行時顯示詳細的信息。
-x 不要匯出模塊的外部符號。
-X 匯出模塊所有的外部符號,此為預設值。

⑵ arm linux中 mknod insmod mount區別與用法cat/proc/devices是什麼意思謝謝

mknod 是創建設備節點命令
insmod 是載入內核模塊的命令
mount 是掛載命令
編譯後的內核模塊xxxxx.ko 使用insmod載入,然後再/dev 下創建設備節點或者叫設備文件(使用的命令就是mknod)。
mount掛載用的和上面2個沒啥聯系、
cat/proc/devices 是查看內核使用的主設備號

⑶ 內核模塊編譯時怎樣繞過insmod時的版本檢查

1、Uboot:每個arm晶元或者海斯晶元都有各自的uboot。
2、但他們的內核版本可以是一樣的,主要是跟各自內核的進行的編譯選項有關, 31的內核版本里加了版本檢查選項「Kernel type->Symmetrical Multi-Processing」,而21的內核版本沒有設置該選項。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在開發kernel driver時,總是會遇到討人厭的vermagic檢查,只要目前在run的kernel版本跟driver編譯時用的kernel版本不一致,就沒辦法insmod。
bash-3.2# insmod sdio.ko
sdio: version magic '2.6.28-271-gec75a15 preempt mod_unload modversions ARMv7 '
should be '2.6.28 preempt mod_unload ARMv7 '
insmod: init_mole 'sdio.ko' failed (Exec format error)
這大大降低了開發速度,尤其是當你拿不到客戶在用的kernel時,又要開發driver給他用,真的是很麻煩……
那麼要怎麼利用惡心的方式繞過去呢???
一、先把 Moudle version 檢查關掉。
user@host # ARCH=arm make menuconfig
--- Enable loadable mole support │ │
│ │ [ ] Forced mole loading │ │
│ │ [*] Mole unloading │ │
│ │ [*] Forced mole unloading │ │
│ │ [ ] Mole versioning support │ │
│ │ [ ] Source checksum for all moles
二、 使用modinfo時,可以看到目前這driver的vermagic
filename: external_drivers/omap3530/Linux/sdio/sdio.ko
author: Texas Instruments Inc
alias: TIWLAN_SDIO
license: GPL
description: TI WLAN SDIO driver
depends:
vermagic: 2.6.28-271-gec75a15 preempt mod_unload ARMv7
parm: g_sdio_debug_level:debug level (int)
三、 修改 kernel 的 vermagic,再重新編譯driver
vermagic 的第一個值 2.6.28-noneed 是由這 include/linux/utsrelease.h里的 UTS_RELEASE 所定義。
#define UTS_RELEASE "2.6.28-271-gec75a15"
之後再由 include/linux/vermagic.h 里的 macro
去組合出 VERMAGIC_STRING , 也就是 kernel 的vermagic。
#include
#include

#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif完成編譯後,你就可以得
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifndef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif
#define VERMAGIC_STRING \
UTS_RELEASE " " \
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
MODULE_ARCH_VERMAGIC
所以, 我們只要把 UTS_RELEASE 改成我們的數字即可,當然若是懶得去try組合後的字串,也可以直接將VERMAGIC_STRING改成你要的字串
建議修改完 vermagic.h, utsrelease.h後,還是把kernel重編完再編kernel,比較保險。
以下是修改後,用modinfo看的結果
filename: external_drivers/omap3530/Linux/sdio/sdio.ko
author: Texas Instruments Inc
alias: TIWLAN_SDIO
license: GPL
description: TI WLAN SDIO driver
depends:
vermagic: 2.6.28 preempt mod_unload ARMv7
parm: g_sdio_debug_level:debug level (int)
------------------------------------------------------------------------------------------
另外若你是用git 做版本控制 , 那就會出現git的版本號在kernel 編號上
所以要把他關掉

General setup --->
[ ] Automatically append version information to the version strin
解釋;
CONFIG_LOCALVERSION_AUTO: │
│ │
│ This will try to automatically determine if the current tree is a │
│ release tree by looking for git tags that belong to the current │
│ top of tree revision. │
│ │
│ A string of the format -gxxxxxxxx will be added to the localversion │
│ if a git-based tree is found. The string generated by this will be │
│ appended after any matching localversion* files, and after the value │
│ set in CONFIG_LOCALVERSION. │
│ │
│ (The actual string used here is the first eight characters proced │
│ by running the command: │

│ which is done within the script "scripts/setlocalversion".) │
│ │
│ Symbol: LOCALVERSION_AUTO [=y] │
│ Prompt: Automatically append version information to the version string │
│ Defined at init/Kconfig:84 │
│ Location: │
│ ingT

⑷ 如何編譯程序在開發板上面運行

用戶程序insmod 核心模塊載入:具體如下:

核心模塊編譯完成後,基本上是個未經符號定位的目標文件(object)(當然,如果這個object又是一些子object經過ld -r生成的話,則子object之間的符號定位是已經完成的),object是一種可重定位的代碼,它可以載入到不同位置的內存執行。而真正載入進核心,並成為核心的一部分,則是用戶程序insmod和核心幾個系統調用共同完成的。在此過程中,insmod主要完成或通過系統調用完成以下的工作:
1)由參數找到模塊文件,如insmod foo.o,模塊文件就是foo.o,根據模塊文件計算出模塊文件所需的內存大小
2)調用系統調用create_mole,為該模塊分配核心空間內存
3)調用系統調用query_mole,得到核心提供的符號表,與系統調用create_mole的返回值(核心模塊首地址)加在一起對模塊進行重定位。
4)在用戶空間為核心模塊分配內存,並往該段內存復制一個經過定位的object映象。
5)調用系統調用init_mole,將用戶內存中的模塊映象到相應的核心空間(首地址為create_mole的返回值)。
6)釋放用戶內存,中止insmod運行。
如果一切順利,沒有出現未定位的符號,則核心模塊object就融入系統,成為系統的一部分了。
核心模塊的載入過程對核心來說實際是個「靜態鏈接」的過程,這和用戶程序動態鏈接運行過程再鏈接需要的代碼還是不太一樣的,當然,object的可重定位特性保證了鏈接後的代碼正常運行,這點倒是比較相似的。
以上回答你滿意么?

⑸ 如何在安卓虛擬機里安裝vmware tools

Android也是Linux,必須有root,所以有兩種方式:
(如果Android虛擬機是x86那就只能用第二種方法,但不需要gcc for ARM,直接gcc就可以了)
(1)在Android上直接安裝:
Step 1. 安裝GCC,需要到安卓應用市場比如Google Play下載GCC For Droid plugin的應用,裡面解開有gcc
Step 2. 安裝Terminal應用
Step 3. 編譯Perl

Step 4. 將NDK里對應平台的頭文件復制進來
Step 5. 下載一份Android源代碼復制進來
Step 6. 將vmware tools的tar.gz解開,開始安裝,會提示手動編譯Kernel mole
(2)在Ubuntu上或Windows上編譯後安裝到Android
Step 1. 下載gcc for ARM(NDK里就有)
Step 2. 下載Android源代碼
Step 3. 將vmware tools for linux的tar.gz解開,把kernel mole的源代碼復制出來編譯

之後就是用busybox 的insmod命令載入kernel mole;如果想每次自動啟動,需要手動修改android rom的啟動文件,或者寫個apk service讓它自動載入。

⑹ 內核模塊編譯怎樣繞過insmod時的版本檢查

一、先把 Moudle version 檢查關掉。
user@host # ARCH=arm make menuconfig
--- Enable loadable mole support │ │
│ │ [ ] Forced mole loading │ │
│ │ [*] Mole unloading │ │
│ │ [*] Forced mole unloading │ │
│ │ [ ] Mole versioning support │ │
│ │ [ ] Source checksum for all moles
二、 使用modinfo時,可以看到目前這driver的vermagic
filename: external_drivers/omap3530/Linux/sdio/sdio.ko
author: Texas Instruments Inc
alias: TIWLAN_SDIO
license: GPL
description: TI WLAN SDIO driver
depends:
vermagic: 2.6.28-271-gec75a15 preempt mod_unload ARMv7
parm: g_sdio_debug_level:debug level (int)
三、 修改 kernel 的 vermagic,再重新編譯driver
vermagic 的第一個值 2.6.28-noneed 是由這 include/linux/utsrelease.h里的 UTS_RELEASE 所定義。
#define UTS_RELEASE "2.6.28-271-gec75a15"
之後再由 include/linux/vermagic.h 里的 macro
去組合出 VERMAGIC_STRING , 也就是 kernel 的vermagic。
#include
#include
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif完成編譯後,你就可以得
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifndef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif
#define VERMAGIC_STRING \
UTS_RELEASE " " \
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
MODULE_ARCH_VERMAGIC
所以, 我們只要把 UTS_RELEASE 改成我們的數字即可,當然若是懶得去try組合後的字串,也可以直接將VERMAGIC_STRING改成你要的字串
建議修改完 vermagic.h, utsrelease.h後,還是把kernel重編完再編kernel,比較保險。

⑺ 安卓 用超級終端 INSMOD出現 exec format error 大神進 在線等那

之後手機沒出現什麼不正常吧?那個不用管他。估計是內存分區的問題。那個exec格式錯誤。每次我刷機都提示沒有發現ext2分區,那個是SD卡的第二個分區。建議少用終端模擬輸入命令代碼,萬一出錯有可能完成系統出問題。因為su就授予最高許可權了

⑻ 安卓的虛擬機怎麼安裝vmtool

1、運行VM,啟動你的虛擬LINUX系統。(linux怎麼安裝看我以前的文章)
2、切換到原系統(Ctrl+Alt),選擇VM中的VM菜單----Install VMWare Tools。

3、一般情況下虛擬機是自帶有VMtool的,如果沒有,沒關系,去網上下載一個就行了。然後掛鏡像,setting里。請把你的VM-Tools的ISO文件映射到你的虛擬系統上,同時,別忘記了把這個虛擬光碟機給connect

4、切換到虛擬系統。(如果開機桌面上就有一個cd的圖片就省略這一步)右下角有個cd的小圖標,右鍵 「連接(connect)」

5、現在桌面上就有一個cd的圖標,雙擊進去,把VMWareTools-xxx.x….tar.gz復制到桌面,並解壓縮到當前目錄,也可以到其他路徑。

解壓出來的文件夾中找到vmware-install.pl。雙擊運行它。

6、記住無論出現什麼(讓你Yes or No)都是回車,一直到出現如下畫面的時候,表示安裝成功!!也就是 「enjoy」。

⑼ linux驅動模塊insmod時處理器類型錯誤

內核模塊有版本識別,必須用目標內核版本的源代碼編譯才可以。

⑽ 嵌入式驅動編譯後,用insmod ,提示ELF file filename.o not for this architecture,請問是什麼出錯了

ELF文件名O,非本體系文件。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:705
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:969
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:677
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:830
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:737
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1076
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:308
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:188
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:875
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:829