linux下如何建立內核源碼樹

最近在看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 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章