Linux2.6 模組的兩種編譯方式

來源:互聯網
上載者:User

題目:核心模組的編譯方法
日期:2008.5.15
作者:singyea@ 七星居

如果想要在核心上擴充功能,有兩條路可選,一是將自己的模組編譯進Kernel,使模組成為核心的一部分;一是以模組的方式供核心載入。前者高效後者靈活,各有所長。以核心模組載入到核心是大多數裝置驅動所採用的方式。關於模組的編譯的方法在這裡詳細討論一下。只針對2.6核心,還沒看其他版本的實現方法,不知道 2.6以前是不是這樣的。

本人測試環境: Redhat as4 ( kernel:2.6.9-5 );
   GCC ( version 3.4.3 );
   make ( 3.80 )

 

將自己的模組編譯進核心的詳細步驟:
將自己的模組編譯進核心,是寫裝置驅動的第一步。
首先要準備一分完整的正確的源碼樹,沒有的可以在http://www.kernel.org 上下載,或者找到安裝盤將源碼包安裝上。
現在假若你有了一份源碼樹在相應的目錄。開始寫自己的模組:如果你想我一樣懶,那就COPY一下吧。

      1 #include <linux/init.h>
      2 #include <linux/module.h>
      3
      4
      5 static __init int test_init(void)
      6 {
      7         printk(KERN_ALERT"Test module is ready.../n");
      8         return 0;
      9 }
     10
     11
     12 static __exit void test_exit(void)
     13 {
     14         printk(KERN_ALERT"Test module is exit .../n");
     15         return ;
     16 }
     17
     18
     19 module_init(test_init);
     20 module_exit(test_exit);
     21
     22 MODULE_LICENSE("Dual BSD/GPL");
     23 MODULE_AUTHOR("Singyea");
     24 MODULE_DESCRIPTION("This is a simple module");
     25 MODULE_VERSION("Ver 0.1");

     儲存為test.c 就是一個最簡單的模組了,只有核心模組載入執行函數test_init()和模組卸載執行函數 test_exit()。還有一些關於模組的資訊:
     所使用的許可聲明,作者,版本,描述等,這些資訊等編譯成模組後可以用 modinfo 命令得到。

     將test.c copy到核心源碼樹中。這裡的例子放到了/usr/src/kernels/2.6.9-5.EL-i686/drivers/char 下,就把它當作一個字元裝置吧。呵呵
     然後修改 /usr/src/kernels/2.6.9-5.EL-i686/drivers/char下的 Kconfig 檔案
     在 menu "Character devices" 下增加 一個config項,就叫 TEST吧。
     例:
menu "Character devices"
  
config TEST_MODULES
   tristate TEST
   default m
   ---help---
   This is a example
   ...
   ...
   ...
儲存退出。
然後在 /usr/src/kernels/2.6.9-5.EL-i686/drivers/char下的 Makefile 檔案裡
增加一個對象,例:

   obj-$(CONFIG_MAGIC_SYSRQ)       += sysrq.o
   obj-$(CONFIG_ESPSERIAL)         += esp.o
   obj-$(CONFIG_TEST)              += test.o //新增加
   obj-$(CONFIG_MVME147_SCC)       += generic_serial.o vme_scc.o

這樣一個新的模組就可以被核心所提供的編譯系統所認識了。
進入 圖形配置介面:makemenuconfig .在   
   Device Drivers --->
    Character devices --->
   
下可以看到自己所加的模組。選 M 編譯成獨立模組,選 * 編譯進核心,空表示不進行編譯。根據自己的需要對核心進行裁減
具體內容可以參照金步國的文檔,N經典啊。
配置好之後就可以進行 核心及模組的編譯了
make
make modules

還有一個簡單的方法:

對於只想測試一個模組編寫的是否正確而進行全部編譯。感覺是不是太 “殺雞用牛刀”啦 ?確實,牛人們也認識到這一點了,
就產生了另一種編譯獨立模組的方法。

還拿上面的例子來說 。寫好之後,放在了某個檔案夾下。比如在 /root/LinuxDrivers/下 這裡只用編寫一個 Makefile檔案就可以了
在同一檔案下建立如下Makefile檔案:
    [root@SingyeaLinux test]# vi Makefile

    1 KERDIR ?= /usr/src/kernels/2.6.9-5.EL-i686/
    2 PWD := $(shell pwd)
    3         obj-m := test.o
    4 default:
    5         $(MAKE) -C $(KERDIR) M=$(PWD) modules

這個Makefile檔案是最簡單例子。其中 第一句,變數KERDIR儲存的是 核心源碼樹的位置;第二行是取得當前路徑;第三行是確定編譯目標
還有一個完美點的例子,優點是它可以區分出來自己是在核心源碼樹裡面被編譯的還是在源碼樹之外被編譯的:

  
    [root@SingyeaLinux test]# vi Makefile
    1
    2 #如果已定義KERNELRELEASE,則說明是從核心構造系統調用的,因此可利用其內建語句。
    3 ifneq($(KERNELRELEASE),)
    4         obj-m :=test.o
    5 #否則,是直接從命令列調用的,這時要調用核心構造系統
    6 else
    7 KERNELDIR ?=/usr/src/kernels/2.6.9-5.EL-i686/
    8 PWD := $(shell pwd)
    9 Default:
    10 $(MAKE) –C $(KERNELDIR) M=$(PWD) modules
    11 endif

這段代碼是我從老師那裡抓過來的,沒改。。。

OK,一切就緒,make 一下。看產生 test.ko了沒有。產生了,那就不浪費你時間了,沒有那就需要再看看啦。發mail給我,
或許會有點協助 sigyea@163.com

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.