新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 手把手教你學(xué)linux驅(qū)動開發(fā) OK6410系列之01---模塊編程

手把手教你學(xué)linux驅(qū)動開發(fā) OK6410系列之01---模塊編程

作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
一、實驗環(huán)境

開發(fā)機環(huán)境

本文引用地址:http://m.butianyuan.cn/article/201611/322698.htm

操作系統(tǒng):ubuntu 9.10

交叉編譯環(huán)境:arm-linux-gcc4.2.2 ,安裝位置 /usr/local/arm/4.3.2/

6410板子內(nèi)核源碼路徑:/work/linux-2.6.36.2-v1.05/

目標(biāo)板環(huán)境:OK6410-Alinux2.6.36

二、實驗原理

模塊時在內(nèi)核空間運行的,模塊中不能使用glibc庫中的函數(shù)。

模塊可以動態(tài)的裝載到內(nèi)核中。

三、實驗步驟

注意:最好使用root用戶進行以下實驗,否則需要利用sudo

1、驗證交叉編譯工具配置正確。安裝交叉編譯器的步驟見《OK6410-A開發(fā)板LINUX2.6.36用戶手冊.pdf》5-5小節(jié)。

#arm-linux-gcc-v

輸入命令后,如果顯示以上信息,則表示開發(fā)環(huán)境正確。否則需要將arm-linux-gcc所在的路徑加入到PATH中。方法如下:

編輯/etc/profile文件添加把編譯器路徑到環(huán)境變量PATH中

# vi /etc/profile

PATH=/usr/local/arm/4.3.2/bin:$PATH
  1. exportPATH

輸入以下命令使配置生效。
#source /etc/profile

2、編寫模塊源文件

#vitest.c

  1. #include
  2. #include
  3. #include
  4. staticint__inithello_init(void)
  5. {
  6. printk("Helloworldn");
  7. return0;
  8. }
  9. staticvoid__exithello_exit(void)
  10. {
  11. printk("Goodbyeworldn");
  12. }
  13. module_init(hello_init);
  14. module_exit(hello_exit);
  15. MODULE_LICENSE("DualBSD/GPL");

代碼解釋:

static int __init hello_init(void)

static void __exit hello_exit(void)

– static聲明,因為這種函數(shù)在特定文件之外沒有其它意義
– __init標(biāo)記

表明該函數(shù)只在初始化期間使用。

模塊裝載后,將該函數(shù)占用的內(nèi)存空間釋放

– __exit標(biāo)記

該代碼僅用于模塊卸載。

printk 內(nèi)核函數(shù),打印信息,類似于用戶空間glibc庫中的printf,注意在內(nèi)核中不能使用glibc庫中的函數(shù)。

module_init(hello_init);

module_exit(hello_exit);

–宏:module_init/module_exit
–聲明模塊初始化及清除函數(shù)所在的位置
–裝載和卸載模塊時,內(nèi)核可以自動找到相應(yīng)的函數(shù)

3、編寫Makefile文件

#viMakefile

  1. obj-m:=test.o
  2. KDIR:=/work/linux-2.6.36.2-v1.05/
  3. all:
  4. make-C$(KDIR)M=$(shellpwd)modules
  5. clean:
  6. make-C$(KDIR)M=$(shellpwd)clean

注意:

  • 1、2、4行頂行寫,3、5行使用tab縮進。
  • KDIR為6410開發(fā)板的內(nèi)核源碼路徑
  • test.o,因為我們的源文件為test.c,所以這里要寫test.o
  • Makefile文件與test.c文件放在同一個目錄下,比如/work/lab/test01/
    上一頁 1 2 下一頁

評論


技術(shù)專區(qū)

關(guān)閉