linux下用arm-none-linux-gnueabi交叉編譯arm內核模塊

前不久導師要求交叉編譯一個基於arm平臺開發的內核模塊來練手,在網上查了很多資料才弄出來,於是將這些零散的信息綜合起來給和我一樣的入門人員瞭解。水平有限,請諒解~


1.安裝arm-none-linux-gnueabi交叉編譯器


很多時候我們需要編譯運行在其他平臺的文件,而沒有條件在目標平臺上直接編譯時,我們就用到了交叉編譯。顧名思義就是在現有平臺編譯目標平臺的程序。


linux編譯arm平臺的內核模塊時,大多采用arm-none-linux-gnueabi交叉編譯器。這個編譯器雖然在官網可以下載但是很難找,在此貼出一個百度雲盤的共享地址:http://pan.baidu.com/share/link?shareid=2940135020&uk=1443951890


ubuntu下,輸入命令:


$tar -xvjf armarm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar


將該文件解壓。然後輸入命令:gedit ~/.bashrc 在文件的末尾添加 exportPATH=$PATH:/usr/local/arm/4.4.3/bin


這樣就配置好了環境變量。我們可以輸入 arm-none-linux然後按Tab鍵看是否填充來判斷環境變量是否配置完好。


請注意一點,由於arm-none-linux-gnueabi需要運行在32位的linux上,如果按照上述配置完了環境變量後依然無法填充,請檢查linux的版本是32位還是64位(可以輸入:getconf LONG_BIT 查看)如果是64位操作系統那麼要麼重新安裝32位要麼輸入命令:sudo apt-getinstall ia32-libs 來安裝32位的兼容庫。



2.構造linux內核源碼樹


在編寫內核模塊時需要引用到相應的文件。如果不去構造linux內核源碼樹就進行編譯的話,會提示找不到相應的.h文件。一般來說,要編譯一個內核模塊時一定要知道它是基於哪個內核版本編寫的。然後下載這個版本的內核源碼構造源碼樹。比如說,需要編譯的內核模塊時基於2.6的內核,而現在使用的ubuntu是基於3.2內核的版本。沒有關係,下載2.6的內核,然後放到一個文件夾中進行構造就行。爲圖方便,可以直接放在桌面。


內核源碼可以事先下載,然後再linux下解壓。也可以輸入命令:sudo apt-get install linux-source-2.6.27 (如果是其他版本只要替換後面的版本數字就可以了)下載源碼,然後到/usr/src裏面找到它,並對其進行解壓。


然後我們輸入命令:export ARCH=arm 以及


export CROSS_COMPILE=arm-none-linux-gnueabi-
這裏的CROSS_COMPILE環境變量就是指定交叉編譯器。進入解壓後的源碼目錄。假設我們的源碼目錄在~/Desktop/linux-source-2.6.27下,那麼我們先進入它的/arch/arm/configs文件夾中找一個config文件,至於選哪個合適說實話我也沒弄清楚,當時我所選的是S3C_2410_defconfig文件。貌似選哪一個文件得和目標平臺有關。當選好config文件後,用cp 命令將其複製到~Desktop/linux-source-2.6.27 也就是我們的源碼目錄下,並更名爲.config 更名後的文件需要使用ls -a才能顯示出來。


做好這一切後,接下來就運行命令 sudo make menuconfig ,如果不出意外就會看到類似以下界面:

233155970.jpg

然後作用鍵選擇退出這個界面。需要說明一點,如果在運行sudo make menuconfig 命令時出現以下錯誤提示信息:


*** Unable to find the ncurses libraries or the
*** required header files.
*** ‘make menuconfig’ requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.


那麼就運行命令:sudo apt-get insatll ncurses-dev


sudo apt-get install libncurses5-dev安裝相應的軟件。如果是在CentOS下則運行命令yum install -y ncurses-devel 即可。


接下來就依次運行以下命令:


sudo make oldconfig 


sudo make (時間比較長)


sudo make bzImage 


sudo make modules 


sudo make modules_install


在網上看到很多人執行這些命令時遇到了些錯誤以及他們解決的辦法。不過由於我試了幾次都沒有問題,在此就不貼出問題了,如果遇到可以“放狗搜一下”。


成功執行上述命令後,我們會在源碼目錄下看到vmlinux.o文件。



3.編譯內核模塊


內核模塊的Makefile文件中,KERN_DIR = /lib/modules/$(shell uname -r)/build就是引用內核源碼樹的位置。當我們構建好了內核源碼樹後只需要將$(shell uname -r)換成安裝好的內核源碼版本就行。具體可以進入/lib/modules下查看。



以上就是我初學交叉編譯arm平臺的內核模塊的總結,其實很多部分也只是知其然不知其所以然,還有很多需要學習。整理出來就是希望其他和我一樣的菜鳥可以少走些彎路。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章