新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > hello內核模塊編譯的全過程

        hello內核模塊編譯的全過程

        作者: 時間:2011-02-24 來源:網絡 收藏

        內核版本:2.6.10

        在/home/tmp/下建立兩個文件hello.c,Makefile

        hello.c
        ------------
        #include linux/init.h>
        #include linux/kernel.h>
        #include linux/module.h>

        MODULE_LICENSE("GPL");

        static int hello_init(void)
        {
        printk(KERN_ALERT "hello module initn");
        return 0;
        }

        static void hello_exit(void)
        {
        printk(KERN_ALERT "hello module exitn");
        }

        module_init(hello_init);
        module_exit(hello_exit);

        --------------

        Makefile
        ----------
        ifneq ($(KERNELRELEASE),)
        obj-m := hello.o
        else
        KERNELDIR := /lib/modules/$(shell uname -r)/build
        PWD := $(shell pwd)

        default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
        endif

        clean:
        rm -f *.ko *.mod.c *.mod.o *.o

        -----------
        編譯模塊

        #make

        清除

        #make clean

        -----------

        為了能夠在終端顯示信息,要修改
        /lib/modules/2.6.10/build/include/linux/kernel.h
        文件的KERN_ALERT宏。
        #define KERN_ALERT "1>"
        修改為
        #define KERN_ALERT "0>"

        ------------
        安裝模塊

        #insmod hello.ko

        終端顯示
        hello module init

        查看已安裝的模塊
        #lsmod

        卸載模塊

        #rmmod hello

        終端顯示
        hello module exit

        -----------
        有以下幾點要注意:
        1,hello.c文件中調用的頭文件
        init.h中的module_init(),module_exit()
        kernel.h中的printk(),KERN_ALERT
        module.h中的MODULE_LICENSE()

        2,Makefile文件中的核心是
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
        1),-C $(KERNELDIR)
        表示在$(KERNELDIR)目錄下執行make命令。
        2),M=$(PWD)
        表示包含$(PWD)下的Makefile文件。
        3),modules
        表示模塊編譯。
        4), 用到了ifneq...else...endif語句
        由于開始還沒定義KERNELRELEASE,所以只能執行else分支。
        而在執行
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
        后,會在內核的Makefile中定義KERNELRELEASE,當進入本Makefile時,
        則只會執行ifneq的第一個分支,即
        obj-m := hello.o
        這一句話是非常重要的。事實上,這個Makefile做的本份工作就是它。
        我們也可以用命令行的方式來編譯:

        在Makefile中的內容寫為:
        obj-m := hello.o
        然后在終端敲入:
        #make -C /lib/modules/2.6.10/build M=/home/tmp modules


        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 延寿县| 禄丰县| 凤阳县| 琼海市| 溆浦县| 凤山市| 宜黄县| 尼玛县| 桓台县| 石泉县| 永年县| 东台市| 鸡东县| 通化市| 怀来县| 花垣县| 博爱县| 克什克腾旗| 新兴县| 吉首市| 临汾市| 涿州市| 清远市| 塔河县| 灵石县| 彭山县| 嘉荫县| 广元市| 保德县| 海丰县| 武安市| 靖安县| 宁明县| 河北省| 衡东县| 清远市| 兴义市| 长武县| 大厂| 云林县| 成安县|