恩,多是我比較愚鈍,一個內核編譯搞了一天,各類問題,各類bug,幾度無奈,也是由於我突發奇想,並無按照原來的那種操做,我直接把helloworld程序放到內核模塊中編譯成了一個驅動程序,雖然其中遇到了不知道多少的問題,不過最終是個完美的結局,給本身點個贊!
好了,廢話很少說,直接開始還原個人helloworld驅動內核程序編譯流程。linux
編譯內核,首先要作的就是有一個內核可以供你編譯,我選擇的操做系統是Ubuntu14.04,低版本的系統的編譯難度要小不少,因此固然要選個簡單的了。內核是在官網中直接下載的,網址以下:https://www.kernel.org/git
版本我選擇的是3.16.50,這裏咱們要選擇一個與當前內核版本相近的內核。
內核完成下載之後,首先用su命令啓動管理員權限,接着將內核壓縮包移動至/root文件夾下,並將linux-3.16.50壓縮文件解壓到/usr/src目錄下。github
1.新建文件
首先,新建一個名爲helloworld的文件夾,接着在文件夾內新建helloworld.c文件,c語言程序的內容以下:sql
#include <linux/module.h>
#include <linux/kernel.h>
int init_hello_module(void)
{
printk("***************Start***************\n");
printk("Hello World! Start of hello world module!\n");
return 0;
}
void exit_hello_module(void)
{
printk("***************End***************\n");
printk("Hello World! End of hello world module!\n");
}
MODULE_LICENSE("Dual BSD/GPL");
module_init(init_hello_module);
module_exit(exit_hello_module);
隨後,再在文件夾內新建一個Makefile文件,文件的內容是shell
obj-$(CONFIG_HELLOWORLD)+=helloworld.o
這時候,執行編譯命令後,就會自動進入該目錄下,而且會將helloworld.c編譯成helloworld.o。
繼續,在該文件夾下新建一個Kconfig文件,添加代碼:bash
menu "helloworld driver"
config HELLOWORLD
tristate"HELLOWORLD"
default y
---help---
Say 'Y' here, it will be compiled into thekernel; If you choose 'M', it will be compiled into a module named ashelloworld.ko.
endmenu
注意:help下面的文字千萬不能添加空格,不然在後續操做當中會出現問題,會報錯
最後,將helloworld文件夾總體移動到/src/linux-xxxx/drivers目錄下。微信
2.修改文件
首先,修改/usr/src/linux-xxxx/drivers目錄下的Kconfig文件,在endmenu以前添加一條語句:ui
source "drivers/helloworld/Kconfig"
很明顯,這裏的做用是引用剛剛咱們新建的Kconfig文件,或者更標準一點的用語是掛載。
其次,修改/drivers目錄下的Makefile文件,添加:spa
obj-$(CONFIG_HELLOWORLD) += helloworld/
這行編譯指令告訴模塊構建系統在編譯模塊時須要進入 helloworld/ 子目錄中。此時的驅動程序的編譯取決於一個特殊配置 CONFIG_HELLOWORLD配置選項。
最後,修改arch/arm目錄下的Kconfig文件,在menu 「Device Drivers……endmenu」或者其餘相似的地方直接添加語句:操作系統
source "drivers/helloworld/Kconfig"
因爲咱們是將這個程序的當作驅動程序來啓動,因此在執行命令:
make menuconfig
後,在DeviceDrivers菜單下選擇helloworld驅動,按空格鍵將選項前面的標誌調整爲[*]便可。
使用命令:make -j2
,
2表明的是編譯的速度,爲了加快速度,咱們這裏選擇2,你能夠自行選擇,但也不要過高。
大約在虛擬機編譯下兩個小時左右,編譯工做就完成了。
使用命令:
make modules
,模塊編譯
make modules_install
安裝模塊
make install
最後安裝內核
grub就是管理Ubuntu系統啓動的一個程序,咱們編譯好的內核要運行就要修改對應的grub,其實很簡單。
mkinitramfs 3.16.50 -o /boot/initrd.img-3.16.50
update-grub2
update-grub2命令會幫咱們自動修改grub
最後,重啓選擇新編譯的內核就ok啦!
感謝您的閱讀,歡迎指正博客中存在的問題,也能夠跟我聯繫,一塊兒進步,一塊兒交流!
微信公衆號:進擊的程序狗
郵箱:roobtyan@outlook.com
我的博客:https://roobtyan.github.io