將hello程序做爲驅動程序編譯進系統內核

0x00開始

恩,多是我比較愚鈍,一個內核編譯搞了一天,各類問題,各類bug,幾度無奈,也是由於我突發奇想,並無按照原來的那種操做,我直接把helloworld程序放到內核模塊中編譯成了一個驅動程序,雖然其中遇到了不知道多少的問題,不過最終是個完美的結局,給本身點個贊!
好了,廢話很少說,直接開始還原個人helloworld驅動內核程序編譯流程。linux

0x01下載內核並解壓

編譯內核,首先要作的就是有一個內核可以供你編譯,我選擇的操做系統是Ubuntu14.04,低版本的系統的編譯難度要小不少,因此固然要選個簡單的了。內核是在官網中直接下載的,網址以下:https://www.kernel.org/git

版本我選擇的是3.16.50,這裏咱們要選擇一個與當前內核版本相近的內核。
內核完成下載之後,首先用su命令啓動管理員權限,接着將內核壓縮包移動至/root文件夾下,並將linux-3.16.50壓縮文件解壓到/usr/src目錄下。github

0x02 編寫程序

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"

0x03 選擇掛載該「驅動」

因爲咱們是將這個程序的當作驅動程序來啓動,因此在執行命令:

make menuconfig

後,在DeviceDrivers菜單下選擇helloworld驅動,按空格鍵將選項前面的標誌調整爲[*]便可。
加載成功以後的模塊設置

0x04 開始編譯整個內核

使用命令:make -j2
2表明的是編譯的速度,爲了加快速度,咱們這裏選擇2,你能夠自行選擇,但也不要過高。
大約在虛擬機編譯下兩個小時左右,編譯工做就完成了。

0x04 掛載(安裝)模塊

使用命令:
make modules,模塊編譯
make modules_install 安裝模塊
make install 最後安裝內核

0x05 更改啓動grub

grub就是管理Ubuntu系統啓動的一個程序,咱們編譯好的內核要運行就要修改對應的grub,其實很簡單。

mkinitramfs 3.16.50 -o /boot/initrd.img-3.16.50
update-grub2

update-grub2命令會幫咱們自動修改grub
最後,重啓選擇新編譯的內核就ok啦!

0x06 結語

感謝您的閱讀,歡迎指正博客中存在的問題,也能夠跟我聯繫,一塊兒進步,一塊兒交流!

微信公衆號:進擊的程序狗
郵箱:roobtyan@outlook.com
我的博客:https://roobtyan.github.io

相關文章
相關標籤/搜索