前不久導師要求交叉編譯一個基於arm平台開發的內核模塊來練手,在網上查了很多資料才弄出來,於是將這些零散的信息綜合起來給和我一樣的入門人員了解。水平有限,請諒解~
1.安裝arm-none-linux-gnueabi交叉編譯器
很多時候我們需要編譯運行在其他平台的文件,而沒有條件在目標平台上直接編譯時,我們就用到了交叉編譯。顧名思義就是在現有平台編譯目標平台的程序。
在Linux編譯arm平台的內核模塊時,大多采用arm-none-linux-gnueabi交叉編譯器。這個編譯器雖然在官網可以下載,也可以在LinuxIDC.com下載。
------------------------------------------分割線------------------------------------------
FTP地址:ftp://ftp1.linuxidc.com
用戶名:ftp1.linuxidc.com
密碼:www.linuxidc.com
在 2014年LinuxIDC.com\3月\PHP 5.3入門經典 中文PDF清晰掃描版
下載方法見 http://www.linuxidc.com/Linux/2013-10/91140.htm
------------------------------------------分割線------------------------------------------
在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 ,如果不出意外就會看到類似以下界面:
然後作用鍵選擇退出這個界面。需要說明一點,如果在運行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平台的內核模塊的總結,其實很多部分也只是知其然不知其所以然,還有很多需要學習。整理出來就是希望其他和我一樣的菜鳥可以少走些彎路。