Linux驅動開發學習筆記(1):LINUX驅動版本的hello world

一、關於目錄
    /lib/modules/2.6.9-42.ELsmp/build/   這個是內核源碼所在的目錄
    通常使用這樣的命令進入這個目錄:cd /lib/modules/$(uname -r)/build/
   這個目錄實際上指向了:/usr/src/kernels/2.6.9-42.EL-smp-i686

二、編譯驅動所使用的makefile
    實際上編譯驅動的時候是使用預先提供的一個makefile的,位置在:
/lib/modules/$(uname -r)/build/Makefile
    注意:M是大寫的

三、網上抄錄的Linux驅動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);

四、寫個makefile來編譯這個驅動:(版本一,最簡單的)
#下面這行是文件Makefile的內容,注意M是大寫的
obj-m := hello.o

把hello.c和Makefile保存在同一目錄,而後執行:
make -C /lib/modules/`uname -r`/build SUBDIRS=$PWD modules
這樣驅動就編譯好了,成果是hello.ko文件。
注意:makefile必定要寫成Makefile,若是寫成makefile就編譯不過。(折騰啊,就這一步耗了N多時間)

五、再寫另外一種Makefile:(版本二:最省事的)
#如下是Makefile文件的內容
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

而後執行:make就編譯成功了,命令行再也不加參數,很省事。
注意:all: 和clean:下面的行,前面是一個TAB鍵

六、加載驅動:
執行
insmod ./hello.ko
屏幕上沒反應。(由於我是在WINDOWS上用遠程終端連上去的嘛)
OK,先讓時光倒流,回到加載驅動之前,先另開一個窗口,執行:
tail -f /var/log/message
而後在原來的窗口裏執行:
insmod ./hello.ko
哈哈,/var/log/message文件裏面看見了盼望已久的hello world!

七、查看驅動:
lsmod   看見 hello這個驅動在其中

八、卸載驅動:
rmmod hello 
看見/var/log/message裏顯示了goodbyelinux

相關文章
相關標籤/搜索