這個問題真心是處理了一個下午,還本身去下載了個最新的內核拿來編譯,實際上是徹底不必的,由於ubuntu系統是能夠直接下載新內核的。html
你能夠在/usr/src/文件夾下找到這些內核文件夾,好比說我本身的系統:linux
寫博客的時候使用的是3.13.0-19的內核。shell
寫一個hello.c的測試文件:ubuntu
1 #include <linux/kernel.h> /*Needed by all modules*/ 2 #include <linux/module.h> /*Needed for KERN_* */ 3 #include <linux/init.h> /* Needed for the macros */ 4 5 MODULE_LICENSE("GPL"); 6 7 static int year=2014; 8 9 static int hello_init(void) 10 { 11 printk(KERN_WARNING "Hello kernel, it's %d!\n",year); 12 return 0; 13 } 14 15 16 static void hello_exit(void) 17 { 18 printk("Bye, kernel!\n"); 19 } 20 21 /* main module function*/ 22 module_init(hello_init); 23 module_exit(hello_exit);
而後用kbuild標準寫一個Makefile文件:測試
1 obj-m := hello.o 2 3 all : 4 $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 5 6 clean: 7 $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
obj-m := name.o表示會編譯一個模塊(-m),生成的name.o文件來自於name.c文件。ui
uname -r 命令返回的實際就是你如今使用的內核版本,好比說個人系統:spa
因此-C選項後面完整的路徑是:/lib/modules/3.13.0-19-generic/build,可是不建議給出具體的路徑,而是用$(shell uname -r)這種可變的路徑,這樣,當你在低版本內核中編譯過,拿到高版本內核中再次編譯的時候也能正常經過。code
編譯完成以後可以看到模塊文件:
$sudo insmod ./hello.ko #加載
$sudo rmmod hello #刪除 或者 sudo rmmod ./hello.ko htm
若是是要在Eclipse中開發也是差很少的,不過有些地方要做修改,一是項目中Path and symbol那裏彷佛要添加內核的include文件夾,而後在symbol選項卡中需添加__MODULE__。blog
還有,要關閉當前項目的makefile自動生成功能。
若是你想要Eclipse集成環境來開發的話,選工程的時候請選Makefile project。本身寫Makefile。
其它都是差很少的,網上寫的那些亂七八糟的又複雜又報錯,真特麼是各類坑爹。
參考文檔:
http://www.cnblogs.com/QuLory/archive/2012/10/23/2736339.html