带您进入内核开发的大门 | 第一个内核程序

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

相关文章
相关标签/搜索