一、實驗環境
開發機環境
作業系統:ubuntu 9.10
交叉編譯環境:arm-linux-gcc 4.2.2 ,安裝位置 /usr/local/arm/4.3.2/
6410板子核心源碼路徑:/work/linux-2.6.36.2-v1.05/
目標板環境:OK6410-A linux2.6.36
二、實驗原理
模組時在核心空間啟動並執行,模組中不能使用glibc庫中的函數。
模組可以動態裝載到核心中。
三、實驗步驟
注意:最好使用root使用者進行以下實驗,否則需要利用sudo
1、驗證交叉編譯工具配置正確。安裝交叉編譯器的步驟見《OK6410-A開發板LINUX2.6.36使用者手冊.pdf》5-5小節。
#arm-linux-gcc -v
輸入命令後,如果顯示以上資訊,則表示開發環境正確。否則需要將arm-linux-gcc所在的路徑加入到PATH中。方法如下:
編輯/etc/profile檔案添加把編譯器路徑到環境變數PATH中
# vi /etc/profile
PATH=/usr/local/arm/4.3.2/bin:$PATHexport PATH
輸入以下命令使配置生效。
#source /etc/profile
2、編寫模組源檔案
#vi test.c
#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>static int __init hello_init(void){printk(Hello world\n");return 0;}static void __exit hello_exit(void){printk(Goodbye world\n");}module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("Dual BSD/GPL");
代碼解釋:
static int __init hello_init(void)
static void __exit hello_exit(void)
– static聲明,因為這種函數在特定檔案之外沒有其它意義 – __init標記
表明該函數只在初始化期間使用。
模組裝載後,將該函數佔用的記憶體空間釋放
– __exit標記
該代碼僅用於模組卸載。
printk 核心功能,列印資訊,類似於使用者空間glibc庫中的printf,注意在核心中不能使用glibc庫中的函數。
module_init(hello_init);
module_exit(hello_exit);
–宏:module_init/module_exit –聲明模組初始化及清除函數所在的位置 –裝載和卸載模組時,核心可以自動找到相應的函數
3、編寫Makefile檔案
#vi Makefile
obj-m := test.oKDIR :=/work/linux-2.6.36.2-v1.05/all: make -C $(KDIR) M=$(shell pwd) modulesclean: make -C $(KDIR) M=$(shell pwd) clean
注意:
- 1、2、4行頂行寫,3、5行使用tab縮排。
- KDIR為6410開發板的核心源碼路徑
- test.o,因為我們的源檔案為test.c,所以這裡要寫test.o
- Makefile檔案與test.c檔案放在同一個目錄下,比如/work/lab/test01/
4、編譯模組
在work/lab/test01/目錄下輸入make命令。
#make
成功後會產生 test.ko檔案。這個就是我們需要的模組檔案,其他的都是中間的臨時檔案。
查看一下test.ko檔案資訊,可以看出是基於ARM平台的目標檔案。
#file test.ko
可能出錯原因
注意:由於編譯模組時需要使用核心中的一些依賴檔案,因此需要確保在核心源碼中那些檔案存在。
如果上面的編譯有錯誤,我們需要在核心源碼根目錄下(/work/linux-2.6.36.2-v1.05/)執行以下命令
#make oldconfig && make prepare && make scripts
5、測試模組
將前面產生的模組檔案(test.ko)下載到開發板的 /lib/modules/2.6.36.2 目錄下(如果沒有此目錄,則需要手動建立)。
在開發板上進行模組的裝載與卸載操作。
(1)裝載模組
# insmod /lib/modules/2.6.36.2/test.ko
(2)查看模組列表
#lsmod
(3)卸載模組
#rmmod test
運行結果如:
作者:滄海獵人 出處:http://blog.csdn.net/embedded_hunter 轉載請註明出處 嵌入式技術交流QQ群:179012822
總結
- 在做以上實驗時,要一直思考每個步驟的作用。我會盡量寫的詳細一些,你千萬不要只知道照著敲命令,否則你很難有進步。