Linux内核模块编程小试炼

一、前言

这学期选修了一门Linux内核原理课程,虽然课上听懂的真的不是很多(老师讲的很底层,很细节,但是奈何本人对自己完全不知晓的东西抗拒心还蛮大的,只是认真听了自己接触过的东西的原理,算是蛮可惜的吧,应该学习的时候课下结合实践和自学),做大作业的时候涉及到了内核模块编译,本科阶段接触过重编译内核的过程,这次学到了新的方法,通过添加内核模块编译,觉着值得记录一下,这里放一下一个简单Hello World版本的内核模块编译算是记录~

二、参考

Linux内核模块的一些知识点总结:http://www.360doc.com/content/16/0802/03/33848986_580142210.shtml

三、知识点简介

为了使系统功能能够更灵活的扩充,Linux支持内核的动态扩展,即在系统运行时给内核增加新的功能即模块module,module是一段可以被动态链接的目标代码(.ko),它可由insmod命令动态的装载并链接到正在运行的内核。链接后就成了内核的一部分,直到用rmmod命令解除链接并卸载。

内核模块不能调用C标准函数库(glibc库),只能调用linux内核导出的内核函数

一般内核模块程序源码构成如下表所示,头文件、许可声明、加载函数和卸载函数都是内核编程中必不可少的部分。

头文件 #include            

           #include

许可声明 MODULE_LICENSE("Dual BSD/GPL");
加载函数 static int __init hello_init(void)
卸载函数 static void __exit hello_exit(void)

 

模块加载函数必须用宏“module_init”指定,它返回整型值。若初始化成功则返回0,若失败则返回一个负值作为错误码;模块卸载函数必须用宏“module_exit”指定,无返回值。其中“__init”和“__exit”都是宏,利用了gcc的扩展关键字,分别要求编译器将所声明函数的目标代码放入“init.text”段和“exit.text”段中,而static关键字为了将该函数名的可见性控制在本文件内。模块许可证声(MODULE_LICENSE)明描述内核模块的许可权限 如果不声明LICENSE,模块被加载时,将收到内核被污染(kernel tainted)的警告。

四、过程

4.1 环境准备

使用的是Ubuntu版本的Linux64位系统,系统装完之后下载相关依赖包(vim、gedit、gcc、build-essential、libc6-dev等)如果出现各种包找不到的问题,放轻松直接百度搜搜怎么解决即可(一般apt-get install update之后再试试可以解决),这个问题感觉就是ubuntu系统缺包比较多导致的,缺啥补啥就行。

另外需要使用root用户操作(Ubuntu下默认都是不允许以root用户进行登录,需要使用sudo passwd root定义root密码后su root输入正确密码进入root用户)

4.2 内核模块程序编写

可以选择vim 一个新文件编辑然后加上.c后缀,但是Ubuntu系统吧vim真的不是很好用,所以建议下载gedit编辑器然后gedit命令打开以后正常文本编写代码,code完之后保存成c文件即可(加个后缀.c即可)

Linux内核模块编程小试炼_第1张图片

4.3 Makfile编写

在内核模块代码相同路径下创建Mafile文件并写入编译内核模块代码的脚本(普通的c程序可以直接gcc XXX.c -o XXX编译生成.o文件执行即可,当然也可makefile,但是内核模块程序需要生成.ko目标链接,方法有所不同,这点需要注意 )

Linux内核模块编程小试炼_第2张图片

4.4 内核模块编译

路径下使用make命令编译,编译成功ls查看会发现生成.o、.ko、.mod.c、.mod.o、.order、.sysmvers等后缀文件

4.5 内核模块加载

使用insmod XXX.ko加载内核模块,使用lsmod | head可查看刚刚加载的内核模块,并且使用dmesg可以查看加载内核模块成功后的输出语句

Linux内核模块编程小试炼_第3张图片

4.6 内核模块卸载

使用rmmod XXX卸载内核模块,使用dmesg可以查看卸载内核模块成功后的输出语句

4.8 删除编译

路径下make clean即可

Linux内核模块编程小试炼_第4张图片

五、总结

这次作业中给我最深的感觉就是,虽然你这个作业你可能一开始摸不着头脑,但是百度一下看看有没有相似的,然后总结这个题他需要做些什么,然后去准备这些涉及到的方面的知识并一点点的实践有个大体基础,然后集成完成整个作业的设计实现。当然了这个过程中可能会因为其他模块基础知识的欠缺会采很多坑,但用时间去填坑也算是一种成就感叭(苦中作乐笑:)

不管怎么说,相信积少成多,相信脚踏实地,相信明明白白做事。

 

你可能感兴趣的:(Linux,Linux)