色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

          開(kāi)發(fā)機(jī)環(huán)境

          本文引用地址:http://cafeforensic.com/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

          二、實(shí)驗(yàn)原理

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

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

          三、實(shí)驗(yàn)步驟

          注意:最好使用root用戶(hù)進(jìn)行以下實(shí)驗(yàn),否則需要利用sudo

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

          #arm-linux-gcc-v

          輸入命令后,如果顯示以上信息,則表示開(kāi)發(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、編寫(xiě)模塊源文件

          #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");

          代碼解釋?zhuān)?/p>

          static int __init hello_init(void)

          static void __exit hello_exit(void)

          – static聲明,因?yàn)檫@種函數(shù)在特定文件之外沒(méi)有其它意義
          – __init標(biāo)記

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

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

          – __exit標(biāo)記

          該代碼僅用于模塊卸載。

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

          module_init(hello_init);

          module_exit(hello_exit);

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

          3、編寫(xiě)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行頂行寫(xiě),3、5行使用tab縮進(jìn)。
          • KDIR為6410開(kāi)發(fā)板的內(nèi)核源碼路徑
          • test.o,因?yàn)槲覀兊脑次募閠est.c,所以這里要寫(xiě)test.o
          • Makefile文件與test.c文件放在同一個(gè)目錄下,比如/work/lab/test01/
            上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉