最近在看O'REILLY 寫的《LINUX 設備驅動程序》,對於如何建立源碼樹不太明朗,於是上網找了些資料,最終成功加載和卸載了Helloworld模塊,廢話不多說,直接開搞。
1、查看內核版本:
2、如果/usr/src目錄下有源碼包,類似下圖中的.tar.bz2文件,則跳過這一步,否則輸入以下命令去獲得源碼:
獲得源碼的過程:
a、luffy@ubuntu:/usr/src$ apt-cache search linux-source
b、luffy@ubuntu:/usr/src$ sudo apt-get install linux-source-3.13.0
下載完成後,輸入su進入超級用戶模式,解壓縮源碼
c、root@ubuntu:/usr/src# tar jxvf linux-source-3.13.0
進入linux-source-3.13.0目錄,開始以原版的配置方式配置內核,當然你也可以選擇其他方式
d、root@ubuntu:/usr/src/linux-source-3.13.0# make oldconfig
退出超級用戶模式,開始執行make指令,持續時間比較長,耐心等待
e、luffy@ubuntu:/usr/src/linux-source-3.13.0$ make
f、luffy@ubuntu:/usr/src/linux-source-3.13.0$ make bzImage 這行中的I是個大寫的i,請親們注意了
以上兩個make可以跳過第一個,直接執行第二個,隨你了,沒差,執行完後,可以用ls查看到vmlinux這個文件,就ok了。
然後進入超級用戶權限,執行以下倆條指令:
g、root@ubuntu:/usr/src/linux-source-3.13.0# make modules
h、root@ubuntu:/usr/src/linux-source-3.13.0# make modules_install
執行的時候會卡頓一下,請耐心等待一會兒,執行完了後會在你的lib/modules 目錄下生成一個generic目錄,如下圖所示:
編譯模塊文件時,會用到generic路徑下的build目錄。
到這裏內核編譯完成,內核樹建立起來了,重啓系統就好了。
下面是書上的HelloWorld驅動,雖然並沒什麼用。
在home下的新建一文件夾linux_d,在裏面寫倆個文件hello.c和Makefile。
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");<pre name="code" class="plain">obj-m := hello.o
KERNELDIR := /lib/modules/3.13.0-32-generic/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
return 0;}static void hello_exit(void){printk(KERN_ALERT"Goodbye, cruel world\n");}module_init(hello_init);module_exit(hello_exit); Makefile如下:
obj-m := hello.o
KERNELDIR := /lib/modules/3.13.0-32-generic/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
請注意你自己的build路徑,路徑要對於,否則編譯不過的。
然後make就ok了。
su進入root,輸入insmod ./hello.ko 加載模塊
利用lsmod查看模塊加載情況
出現hello表示已經加載上了。
輸入rmmod hello 卸載模塊
程序的輸出通過syslog文件查看。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是分界線,其實並不用編譯什麼內核樹,直接make就好啦。
obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
make後,輸入dmesg |grep world 就ok了。
ok,就到這了,希望對你有用,別忘記點贊喲。
參考文章:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299871.html
參考書籍:《LINUX 設備驅動程序》written by O'REILLY