“手把手教你學linux驅動開發”OK6410系列之01—模組編程

來源:互聯網
上載者:User

 一、實驗環境 

開發機環境

          作業系統: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

總結

  • 在做以上實驗時,要一直思考每個步驟的作用。我會盡量寫的詳細一些,你千萬不要只知道照著敲命令,否則你很難有進步。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.