新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 在Linux 2.6內核下編譯可以加載的內核模塊

        在Linux 2.6內核下編譯可以加載的內核模塊

        作者: 時間:2007-05-23 來源:網絡 收藏
        2.6下編譯可以加載的
        By: Wu Yin
        Date: 2007-05-18
        Email: lazy_fox#msn.com
        Homepage:
        http://blog.csdn.net/wooin

        版權信息: 該文章版權由Wu Yin所有。可在非商業目的下任意傳播和復制。
        對于商業目的下對本文的任何行為需經作者同意。
        聯系方式:lazy_fox#msn.com
        1. 在舊的版本下(如linux 2.4)linux的編譯只需要有內核的頭文件就行了,就可以通過和編譯其他程序一樣的方法編譯成filename.o文件,這個.o文件是直接可以加載道內核中的,加載之后就可以用了。然而在2.6下就截然不同了,在linux 2.6下內核的編譯要有系統內核樹的支持,下面介紹一下這個“內核樹”是如何建立的。
        2. 本文的工作環境是Fedora Core 5,用“uname -r”查看內核版本是:2.6.15-1.2054_FC5
        Fedora Core 5 與舊版本不同,不包含 kernel-source 軟件包,我是網上下載的rpm包,地址是:

        下面的工作都是用root用戶執行的。
        3. 安裝內核源碼包:
        # rpm –Uvh kernel-2.6.15-1.2054_FC5.src.rpm
        這個命令將 RPM 內容寫到路徑
        /usr/src/redhat/SOURSE

        /usr/src/redhat/SPECS
        4. build源碼包:
        # cd /usr/src/redhat/SPECS
        # rpmbuild -bp --target i686 kernel-2.6.spec
        這個命令將會把內核源碼樹放到 目錄
        /usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686
        5. 配置內核:
        Fedora Core 附帶的內核配置文件在 configs/ 目錄。
        例如,i686 SMP 配置文件被命名為
        configs/kernel-version-i686-smp.config。
        使用下列命令來將需要的配置文件復制到合適的位置,用來編譯:
        # cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686
        # cp configs/kernel-version-i686-smp .config
        您也可以在 /lib/modules/version/build/.config 這個位置找到與您當前的內核匹配的 .config 文件。

        注意:
        您的內核必須已經啟用這些選項進行了編譯(用make menuconfig調出內核配置菜單):
        Loadable module support --->

        Enable loadable module support

        Module unloading
        [ ] Module versioning support (EXPERIMENTAL)

        Automatic kernel module loading
        6. 稍微更改一下Makefile:
        每個內核的名字都包含了它的版本號,這也是 uname -r 命令顯示的值。內核Makefile 的前四行定義了內核的名字。為了保護官方的內核不被破壞,Makefile
        經過了修改,以生成一個與運行中的內核不同的名字。在一個插入運行中的內核前,這個模塊必須針對運行中的內核進行編譯。為此,您必須編輯內核的
        Makefile。
        例如,如果 uname -r 返回字符串 2.6.15-1.2054_FC5,就將 EXTRAVERSION 定義從:
        EXTRAVERSION = -prep
        修改為:
        EXTRAVERSION = -1.2054_FC5
        也就是最后一個連字符后面的所有內容。
        7. 編譯內核:
        跟普遍的編譯方法一樣了:
        # make bzImage 編譯內核
        # make modules 編譯模塊
        # make modules_install 安裝編譯
        8. 完成“內核樹”的安裝:
        目錄“/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686/”中就是所謂的“內核代碼樹”
        但是“/lib/modules/2.6.15-1.2054_FC5/build”是個符號鏈接,也指向這個目錄,所以這里也可以叫做“內核代碼樹”
        9. 編寫內核模塊源文件:
        // hello.c

        #include linux/init.h>
        #include linux/module.h>
        MODULE_LICENSE(Dual BSD/GPL);

        static int hello_init(void) {
        printk(KERN_ALERT Hello, worldn);
        return 0;
        }

        static void hello_exit(void) {
        printk(KERN_ALERT Goodbye, cruel worldn);
        }

        module_init(hello_init);
        module_exit(hello_exit);

        編寫Makefile:
        # Makefile

        obj-m:=hello.o
        KDIR:=/lib/modules/2.6.15-1.2054_FC5/build
        PWD:=$(shell pwd)

        default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
        10. 執行make命令進行編譯就行了, 執行完畢后,會生成幾個文件:
        hello.ko
        hello.mod.c
        hello.mod.o
        hello.o
        運行命令:
        # insmod hello.ko
        應該可以看到返回的信息:Hello, world
        然后再運行命令:
        # rmmod hello
        應該可以看到返回的信息:Goodbye, cruel world

        如果沒看到,就是輸出到系統的日志文件中去了,可以查看文件:
        /var/log/messages
        應該有信息的輸出。
        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        關鍵詞: 內核 Linux 模塊

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 石泉县| 万载县| 云安县| 依安县| 广灵县| 贵定县| 鄂伦春自治旗| 紫阳县| 开化县| 瓮安县| 乌拉特后旗| 盐津县| 广河县| 平陆县| 卢龙县| 农安县| 屯留县| 赤城县| 井陉县| 宽城| 马关县| 云浮市| 灌南县| 柏乡县| 日喀则市| 纳雍县| 依兰县| 平罗县| 九江市| 称多县| 项城市| 孟村| 开封市| 马公市| 四子王旗| 上林县| 康马县| 凉山| 盐城市| 星子县| 保康县|