內核開發往往給人開發難度大的印象,大家覺得內核開發非常神秘,很高大上。其實內核開發並沒有想像的那麼複雜,它跟普通的用戶態開發基本類似,稍微複雜一點的是內核的調試。本文通過一個簡單的內核程序,讓大家了解內核開發,並進入內核開發的大門。

開發環境

為了避免將自己的操作系統搞掛,本文在虛擬機中進行開發,這樣我們可以隨便折騰。本文所用的環境信息如下。

操作系統:Ubuntu 16.04 Server版

內核版本:4.4.0-31

編譯環境:gcc 5.4.0

程序代碼

主程序代碼

本文代碼也遵從慣例,開發一個非常簡單的HelloWorld程序,在程序啟動的時候列印一條HelloWorld信息,先展示代碼。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
static int hello_init(void)
{
printk("Hello, itworld123.com ");
return 0;
}
static void hello_exit(void)
{
printk("Bye!");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SunnyZhang<[email protected]>");

可以是用任何文本工具將本代碼保存在一個文本文件(hello.c)中進行測試。在Linux系統中可以順序執行如下命令:

mkdir helloworld
cd helloworld
vim hello.c

用vim打開文件後,將上述代碼拷貝到裡面,然後保存退出(好啰嗦,不會使用vim的話,請搜索相關內容學習)。

工程管理

在用戶態開發時,為了方便編譯,通常需要一個Makefile文件管理我們的源文件。內核開發也需要一個Makefile文件。具體內容如下:

obj-m += hello.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := $(shell uname -r)
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

同樣,還是在helloworld目錄下,通過vim命令建立一個名稱為Makefile的文件,並拷貝上述內容。

完成上述內容後,我們其實就完成了一個最簡單內核程序的開發,本文先不具體解釋上述代碼的具體含義,先編譯運行看一下效果。

程序運行

在helloworld目錄下面執行make命令就可以進行編譯,最後會生成一個名稱為hello.ko的問題。該文件就是我們最終完成的可執行文件。在root用戶下,執行如下命令:

sudo insmod hello.ko

如果不是root用戶會報錯,此時可以切換到root用戶,或者執行如下命令:

sudo insmod hello.ko

在生產環境通常是不建議直接使用root用戶的,但為了學習方便可以使用root用戶。

執行上述命令後,我們繼續執行如下命令:

dmesg

此時可以看到在最後有我們列印的信息:

Hello, itworld123.com

完成測試之後,可以執行如下命令卸載程序(模塊):

rmmod hello

可以從本號github下載源代碼,直接解壓編譯。


推薦閱讀:
相关文章