编写一个简单的内核模块程序Hello World!
2017-03-09 16:47
197 查看
一、Linux内核模块基本原理
Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。它们扩展了操作系统内核功能却不需要重新编译内核、启动系统。如果没有内核模块,就不得不反复编译生成操作系统的内核镜像来加入新功能,当附加的功能很多时,还会使内核变得臃肿。一个Linux 内核模块主要由以下几个部分组成:(1) 模块加载函数(必须):当通过insmod 或modprobe 命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块相关初始化工作。
(2) 模块卸载函数(必须):当通过rmmod 命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。
(3) 模块许可证声明(必须):模块许可证(LICENCE)声明描述内核模块的许可权限,如果不声明LICENCE,模块被加载时将收到内核被污染的警告。大多数情况下,内核模块应遵循GPL 兼容许可权。Linux2.6 内核模块最常见的是以MODULE_LICENSE(“Dual BSD/GPL”)语句声明模块采用BSD/GPL 双LICENSE。
(4) 模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量。
(5) 模块导出符号(可选):内核模块可以导出符号(symbol,对应于函数或变量),这样其他模块可以使用本模块中的变量或函数。
(6) 模块作者等信息声明(可选)。
一个内核模块至少包含两个函数,模块被加载时执行的初始化函数init_module()和模块被卸载时执行的结束函数cleanup_module()。在最新内核稳定版本2.6 中,两个函数可以起任意的名字,通过宏module_init()和module_exit()注册调用要编译内核模块,把代码嵌进内核空间,首先要获取内核源代码,且版本必需与当前正在运行的版本一致。
二、编写helloworld.c及其对应的Makefile。
helloworld.c:#include <linux/module.h> #include <linux/kernel.h> int init_hello_module(void) { printk("***************Start***************\n"); printk("Hello World! Start of hello world module!\n"); return 0; } void exit_hello_module(void) { printk("***************End***************\n"); printk("Hello World! End of hello world module!\n"); } MODULE_LICENSE("Dual BSD/GPL"); module_init(init_hello_module); module_exit(exit_hello_module);
Makefile:
# To build modules outside of the kernel tree, we run "make" # in the kernel source tree; the Makefile these then includes this # Makefile once again. # This conditional selects whether we are being included from the # kernel Makefile or not. # called from kernel build system: just declare what our modules are obj-m := helloworld.o CROSS_COMPILE = CC = gcc # Assume the source tree is where the running kernel was built # You should set KERNELDIR in the environment if it's elsewhere KERNELDIR ?= /usr/src/linux-headers-$(shell uname -r) # The current directory is passed to sub-makes as argument PWD := $(shell pwd) all: modules modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend *.symvers .*.cmd *.ko *.mod.c .tmp_versions $(TARGET)
在Makefile中,在obj-m := helloworld.o这句中,.o的文件名要与编译的.c文件名一致。
KERNELDIR ?= /usr/src/linux-headers-$(shell uname -r)指示当前linux系统内核的源码位置。
三、编译:
1.在Makefile及helloworld.c所在目录下,直接make,成功后查看当前目录下有无helloworld.ko文件产生,有则内核模块生成成功。2.使用insmod命令,把此内核模块程序加载到内核中运行。结合lsmod及管道命令,查看内核模块程序在内核中是否正确运行。
3.查看此内核模块程序打印的信息,另开一个终端,输入tail -n /var/log/messages.
使用rmmod命令把之前加载的内核模块卸载掉,然后再次执行第2步,即可看到此内核模块程序打印的信息。
相关文章推荐
- 编写一个简单的内核模块
- 一个简单的内核模块编写到测试的全过程testmodule 之内核版本2.4.20.8
- 编写、编译、安装、移除一个内核模块的基本过程,不能再简单了的
- OS实习-编写一个简单的内核模块
- 编写一个简单的内核模块
- Linux内核监控模块-1-驱动模块(LKM)开发(以一个简单的hello world程序为例)
- 第二章 编写一个简单的jdbc例子程序
- Linux最简单内核模块编写
- ffmpeg+sdl教程----编写一个简单的播放器4(让程序更模块化)
- 一个简单的 C 程序文件,经过 0、编写,1、预处理,2、编译,3、链接,终于生成了一个可执行文件
- 给xt800(手机)写一个hello world的内核模块
- CC1110EM 433MHz 无线模块一个简单收发程序
- 编写一个简单的jdbc例子程序_模版_CRUD_SQL注入
- 编写简单的内核模块
- 使用xcode创建一个简单得hello world 程序。
- 一个简单程序的分析----深至内核
- Linux下,使用C/C++编写一个简单的消息处理程序
- Ophone/OMS编程:编写JIL Widget的一个最简单的例子:hello world。
- 简单思考如何编写描述一个模块
- 一个简单木马程序的编写