內核開發每每給人開發難度大的印象,你們以爲內核開發很是神祕,很高大上。其實內核開發並無想象的那麼複雜,它跟普通的用戶態開發基本相似,稍微複雜一點的是內核的調試。本文經過一個簡單的內核程序,讓你們瞭解內核開發,並進入內核開發的大門。linux
爲了不將本身的操做系統搞掛,本文在虛擬機中進行開發,這樣咱們能夠隨便折騰。本文所用的環境信息以下。shell
操做系統:Ubuntu 16.04 Server版 內核版本:4.4.0-31 編譯環境:gcc 5.4.0vim
主程序代碼bash
本文代碼也聽從慣例,開發一個很是簡單的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<shuningzhang@126.com>");
複製代碼
能夠是用任何文本工具將本代碼保存在一個文本文件(hello.c)中進行測試。在Linux系統中能夠順序執行以下命令:學習
mkdir helloworld cd helloworld vim hello.c測試
用vim打開文件後,將上述代碼拷貝到裏面,而後保存退出(好囉嗦,不會使用vim的話,請搜索相關內容學習)。ui
工程管理spa
在用戶態開發時,爲了方便編譯,一般須要一個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用戶下,執行以下命令:
insmod hello.ko
若是不是root用戶會報錯,此時能夠切換到root用戶,或者執行以下命令:
sudo insmod hello.ko
在生產環境一般是不建議直接使用root用戶的,但爲了學習方即可以使用root用戶。
執行上述命令後,咱們繼續執行以下命令:
dmesg
複製代碼
此時能夠看到在最後有咱們打印的信息:
Hello, itworld123.com
完成測試以後,能夠執行以下命令卸載程序(模塊):
rmmod hello
複製代碼
至此,咱們完成了一個Linux內核模塊,併成功的運行了它,是否是很是簡單!