欢迎来到天天文库
浏览记录
ID:1236806
大小:266.00 KB
页数:27页
时间:2017-11-09
《linux内核模块设计课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux2.6内核模块设计www.gec-edu.org内核模块概述Linux内核是整体式结构,各个子系统联系紧密,作为一个大程序在内核空间运行。内核模块概述太多的设备驱动和内核功能集成在内核中,内核过于庞大。如何解决?Linux内核引入内核模块机制。通过动态加载内核模块,使得在运行过程中扩展内核的功能。不需要的时候,卸载该内核模块。内核模块概述什么是内核模块?内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)。内核模块可以让操作系统内核在需要时载入和执行,在不需要时由操
2、作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。这还意味着一个臃肿的内核。内核模块概述模块机制的优点:减小内核映像尺寸,增加系统灵活性;节省开发时间;修改内核,不必重新编译整个内核。模块的目标代码一旦被链入内核,作用和静态链接的内核目标代码完全等价。模块机制的缺点:对系统性能有一定损失;使用不当时会导致系统崩溃;内核模块概述内核模块是如何被调入内核工作的?当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod执行modprobe去加载内核模块。modprobe遍
3、历文件/lib/modules/$(version)/modules.dep来判断是否有其它内核模块需要在该模块加载前被加载。最后modprobe调用insmod先加载被依赖的模块,然后加载该被内核要求的模块。内核模块概述内核模块的卸载当我们不需要内核模块了,为了减少系统资源的开销,需要卸载时使用命令#rmmodmodule_name或者#modprobe–rmodule_name查看系统已经加载的模块,使用命令#lsmod实验:HelloWorld模块步骤:新建模块目录用编辑器(vi)编辑源文件用编辑器编辑Makefile在内核源码树外编译把模块加到内核源码树并把配置信息同
4、时加入实验:HelloWorld模块#include//formodule_init()#include//mustbeinclude#include//forprintk()staticint__inithello_init(void){printk(“Helloworld”);return0;}staticvoid__exithello_exit(void){printk(“Hellomoduleexit”);}module_init(hello_init);module_
5、exit(hello_exit);MODULE_LICENSE(“GPL”);MODULE_AUTHOR(“hsq”);实验:HelloWorld模块说明:1)模块入口函数为hello_init(),由module_init()宏指定,在模块被加载的时候被调用向系统注册,就象应用程序的main()一样,主要来完成模块的初始化工作2)入口函数的返回值为0表示成功,非0表示失败3)模块的退出函数为hello_exit(),由module_exit()宏指定,在模块被卸载是被调用向系统注销,主要来完成资源的清理工作,它被调用完毕后,就模块就被内核清除了4)一个模块最少需要有入口和退
6、出函数实验:HelloWorld模块说明:关于__init和__exit宏如果该模块被编译进内核,而不是动态加载,则宏__init的使用会在初始化完成后丢弃该函数并收回所占内存。如果该模块被编译进内核,宏__exit将忽略“清理收尾”的函数。这些宏在头文件linux/init.h定义,用来释放内核占用的内存。例如启动时看到的信息“Freeingunusedkernelmemory:236kfreed”,正是内核释放这些函数所占用空间时的打印信息。实验:HelloWorld模块printk()函数printk函数在Linux内核中定义并且对模块可用,为内核提供日志功能,记录内核
7、信息或用来给出警告。与标准C库函数printf的行为相似。每个printk()声明都会带一个优先级。内核总共定义了八个优先级的宏,在linux/kernel.h中定义。若你不指明优先级,DEFAULT_MESSAGE_LOGLEVEL这个默认优先级将被采用。信息添加到文件/var/log/messages,可直接查看,或者用命令dmesg查看。在X-windows下的终端insmod一个模块,日志信息只会记录在日志文件中,而不在终端打印。实验:HelloWorld模块写内核程序需要注意:实验:Hello
此文档下载收益归作者所有