怎么编写Linux内核模块HelloWorld
本篇内容介绍了“怎么编写Linux内核模块HelloWorld”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
公司主营业务:网站建设、成都做网站、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出洮北免费做网站回馈大家。
准备工作
在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16.04。如果是开发板,那么需要安装交叉编译器,但是目前我只在虚拟机的Ubuntu16.04系统里完成驱动模块的加载和卸载,实现了一个最最简单的内核模块,并且通过这个最简单的驱动,学习最基本的概念。
需要先安装对应的开发支持
yum install kernel-headers kernel-devel gcc glibc gcc-c++ -y //等,autoconfig, make等工具。
什么是内核模块
模块是可以根据实际需要可以动态加载和卸载到内核中的代码。它们扩展了内核的功能,而无需重启系统,就可以进行模块加载,并工作。例如,一种类型的模块是设备驱动程序,它允许内核访问连接到系统的硬件。没有模块,我们必须构建整个内核并将新功能直接添加到内核映像中。除了拥有更大的内核之外,这还有一个缺点,就是每次我们想要新功能时都需要我们重新编译内核并烧录到设备。
编写 hello.c
#include//所有模块都会需要这个头文件 #include //下面的宏需要 #include //内核常用库函数 static int __init hello_init(void){ printk(KERN_INFO "module init success\n"); return 0; } static void __exit hello_exit(void){ printk(KERN_INFO "module exit success\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); //开源协议 MODULE_AUTHOR("作者"); MODULE_DESCRIPTION("功能描述");
这是一个简单内核模块程序,可以动态加载和卸载。虽然没有实际的功能。
模块加载的时候系统会打印module init success\n
模块卸载的时候系统会打印module exit success\n
模块编译
Makefile
obj-m := hello.o PWD := $(shell pwd) KVER := $(shell uname -r) KDIR :=/lib/modules/$(KVER)/build/ all: $(MAKE) -C $(KDIR) M=$(PWD) clean: rm -rf *.o *.mod.c *.mod.o *.ko *.symvers *.order *.a
将hello.c
和Makefile
放在同一路径下进行编译,编译成功,会在当前路径下生成hello.ko
,这就是我们将要加载到内核的模块。
相关指令
name | function |
---|---|
lsmod | 查看已经加载到内核中的模块 |
insmod | 加载模块到内核中 |
rmmod | 从内核卸载模块 |
depmod | 生成模块所需要的依赖 |
modprobe | 很强大的指令(-h) |
测试结果
模块加载
加载hello.ko
模块到内核中
如果模块加载成功的话,可以查看模块
lsmod | grep hello
成功加载会显示以下结果
并且可以查看内核打印的消息
dmesg | grep "init success"
[ 4160.003247] module init success
模块卸载
rmmod hello.ko
成功卸载hello
模块后,可以查看内核是否正常打印出我们预设在程序的打印信息。
dmesg | grep "exit success"
可以看到终端上显示module exit success
,说明通过rmmod
成功卸载hello.ko
[ 7160.003247] module exit success
这时候,如果再通过lsmod
去查看当前的内核模块,就会发现hello.ko
已经消失不见了。
“怎么编写Linux内核模块HelloWorld”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
本文题目:怎么编写Linux内核模块HelloWorld
新闻来源:http://pwwzsj.com/article/jhchcd.html