<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    曙海教育集團(tuán)論壇Linux專區(qū)Linux驅(qū)動(dòng)開(kāi)發(fā) → Linux驅(qū)動(dòng)開(kāi)發(fā)學(xué)習(xí)筆記(1):LINUX驅(qū)動(dòng)版本的hello world


      共有9717人關(guān)注過(guò)本帖樹(shù)形打印

    主題:Linux驅(qū)動(dòng)開(kāi)發(fā)學(xué)習(xí)筆記(1):LINUX驅(qū)動(dòng)版本的hello world

    美女呀,離線,留言給我吧!
    wangxinxin
      1樓 個(gè)性首頁(yè) | 博客 | 信息 | 搜索 | 郵箱 | 主頁(yè) | UC


    加好友 發(fā)短信
    等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
    Linux驅(qū)動(dòng)開(kāi)發(fā)學(xué)習(xí)筆記(1):LINUX驅(qū)動(dòng)版本的hello world  發(fā)帖心情 Post By:2010-11-24 11:15:17

     終于下決心好好學(xué)習(xí)LINUX內(nèi)核和驅(qū)動(dòng)開(kāi)發(fā)了,不怕千萬(wàn)人恥笑,勇敢將自己的學(xué)習(xí)過(guò)程寫(xiě)出來(lái):

    1、關(guān)于目錄
        /lib/modules/2.6.9-42.ELsmp/build/   這個(gè)是內(nèi)核源碼所在的目錄
        一般使用這樣的命令進(jìn)入這個(gè)目錄:cd /lib/modules/$(uname -r)/build/
       這個(gè)目錄實(shí)際上指向了:/usr/src/kernels/2.6.9-42.EL-smp-i686

    2、編譯驅(qū)動(dòng)所使用的makefile
        實(shí)際上編譯驅(qū)動(dòng)的時(shí)候是使用預(yù)先提供的一個(gè)makefile的,位置在:
    /lib/modules/$(uname -r)/build/Makefile
        注意:M是大寫(xiě)的

    3、網(wǎng)上抄錄的Linux驅(qū)動(dòng)Hello world的源碼:
    // hello.c
    #include <linux/init.h>
    #include <linux/module.h>

    MODULE_LICENSE("Dual BSD/GPL");

    static int hello_init(void)
    {
        printk(KERN_ALERT "hello world!\n");
        return 0;
    }

    static void hello_exit(void)
    {
        printk(KERN_ALERT "goodbye!\n");
    }

    module_init(hello_init);
    module_exit(hello_exit);

    4、寫(xiě)個(gè)makefile來(lái)編譯這個(gè)驅(qū)動(dòng):(版本一,最簡(jiǎn)單的)
    #下面這行是文件Makefile的內(nèi)容,注意M是大寫(xiě)的
    obj-m := hello.o

    把hello.c和Makefile保存在同一目錄,然后執(zhí)行:
    make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules
    這樣驅(qū)動(dòng)就編譯好了,成果是hello.ko文件。
    注意:makefile一定要寫(xiě)成Makefile,如果寫(xiě)成makefile就編譯不過(guò)。(折騰啊,就這一步耗了N多時(shí)間)

    5、再寫(xiě)另一種Makefile:(版本二:最省事的)
    #以下是Makefile文件的內(nèi)容
    obj-m := hello.o
    KERNEL_DIR := /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    all:
        make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
    clean:
        rm *.o *.ko

    然后執(zhí)行:make就編譯成功了,命令行不再加參數(shù),很省事。
    注意:all: 和clean:下面的行,前面是一個(gè)TAB鍵

    6、加載驅(qū)動(dòng):
    執(zhí)行
    insmod ./hello.ko
    屏幕上沒(méi)反應(yīng)。(因?yàn)槲沂窃赪INDOWS上用遠(yuǎn)程終端連上去的嘛)
    OK,先讓時(shí)光倒流,回到加載驅(qū)動(dòng)以前,先另開(kāi)一個(gè)窗口,執(zhí)行:
    tail -f /var/log/message
    然后在原來(lái)的窗口里執(zhí)行:
    insmod ./hello.ko
    哈哈,/var/log/message文件里面看見(jiàn)了盼望已久的hello world!

    7、查看驅(qū)動(dòng):
    lsmod   看見(jiàn) hello這個(gè)驅(qū)動(dòng)在其中

    8、卸載驅(qū)動(dòng):
    rmmod hello
    看見(jiàn)/var/log/message里顯示了goodbye

    支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

    返回版面帖子列表

    Linux驅(qū)動(dòng)開(kāi)發(fā)學(xué)習(xí)筆記(1):LINUX驅(qū)動(dòng)版本的hello world








    簽名