内核开发每每给人开发难度大的印象,你们以为内核开发很是神秘,很高大上。其实内核开发并无想象的那么复杂,它跟普通的用户态开发基本相似,稍微复杂一点的是内核的调试。本文经过一个简单的内核程序,让你们了解内核开发,并进入内核开发的大门。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内核模块,并成功的运行了它,是否是很是简单!