帶您進入內核開發的大門 | 第一個內核程序

內核開發每每給人開發難度大的印象,你們以爲內核開發很是神祕,很高大上。其實內核開發並無想象的那麼複雜,它跟普通的用戶態開發基本相似,稍微複雜一點的是內核的調試。本文經過一個簡單的內核程序,讓你們瞭解內核開發,並進入內核開發的大門。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內核模塊,併成功的運行了它,是否是很是簡單!

相關文章
相關標籤/搜索