2011-02-01 94 views
4

我想爲android製作一個動態加載的內核模塊。 我不想安裝一個linux,我只是有cygwin和android NDK。android NDK可以編譯內核模塊的源碼嗎?

+0

由於linux沒有內核ABI,因此您必須將模塊編譯到每個單獨的內核。 。 – lovespring 2011-02-05 15:26:00

+0

我可以在固定電話的應用程序中加載LKM,以干擾系統調用。有任何想法嗎? – DroidBot 2013-01-18 09:14:57

回答

1

剛纔我發現this URL用戶試圖加載LKM併成功,雖然在Android(內核核心:2.6.29),我認爲它是在Linux上,而不是在Cygwin上。希望你也能得到它!

還有一個資源herehere too

一切順利!

0

按照這個URL,Android開發人員建議爲這個虛擬Ubuntu鏡像比cygwin。

3

是的,可以使用NDK構建內核模塊。請注意,這對於Linux系統(我被告知Linux x86_64是支持的環境)效果最好,因爲交叉編譯區分大小寫的文件系統上的內核代碼(例如Windows和Mac系統上默認出現的代碼)很難,因爲構建內核模塊需要構建ELF操作二進制文件(modpost),這些二進制文件通常只在Linux上存在,這需要ELF頭文件。 這就是說...

首先,您需要將源代碼獲取到設備上相同的內核,並確保配置與您的設備相同。 (否則有可能會混淆構建系統)

其次,您需要確定交叉編譯器工具鏈在Android NDK中的位置。以下是我找到了我:

$ cd $NDK_HOME 
$ find . | grep '\-gcc$' 
./toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc 
./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc 

(注意,$NDK_HOME是我安裝了Android NDK)

第三,你需要添加$NDK_HOME/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin目錄(或者是任何一個是你的系統)到您的PATH環境變量。

然後,你需要導出兩個環境變量:

export ARCH=arm 
export CROSS_COMPILE=arm-eabi- 

(注意,該arm-eabi-前綴是一樣的就是我們在find命令當內核是建立看到,命令如gccld注意,如果你正在構建一個x86平臺,我期望你將不得不調整這些,我只爲ARM構建了模塊。)

接下來,你應該編譯內核。 (爲此,我從我的Android設備上拉下了/proc/config.gz,在內核源代碼目錄中運行zcat config.gz > .config,然後運行make menuconfig && make。)內核構建大師在這裏可能會知道一些快捷方式,但我無法正確設置內核源代碼目錄用於構建模塊而不進行實際構建。 (如果您的構建樹中的內核與您的設備匹配,則不必實際更新內核,只需插入模塊。)

最後,我使用正常流程從源代碼構建內核模塊。通常,內核模塊將具有參數化版本,該版本將以某種方式讀入內核源碼樹目錄,然後調用版本。此時,只要內核源代碼樹設置正確,並且設置了ARCHCROSS_COMPILE,則應該創建模塊!

祝你好運。我確定每個設備都有一些差異。