实验五__内核模块设计实验

实验五__内核模块设计实验

ID:15330645

大小:72.50 KB

页数:12页

时间:2018-08-02

实验五__内核模块设计实验_第1页
实验五__内核模块设计实验_第2页
实验五__内核模块设计实验_第3页
实验五__内核模块设计实验_第4页
实验五__内核模块设计实验_第5页
资源描述:

《实验五__内核模块设计实验》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、实验五内核模块设计实验文章由www.gygd123.com网提供现代的Linux内核是具有微内核特点的宏内核。Linux内核作为一个大程序在内核空间运行。太多的设备驱动和内核功能集成在内核中,内核过于庞大。Linux内核引入内核模块机制。通过动态加载内核模块,使得在运行过程中扩展内核的功能。不需要的时候,卸载该内核模块。内核模块内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)。内核模块可以让操作系统内核在需要时载入和执行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却

2、不需要重新启动系统。如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。这还意味着一个臃肿的内核。内核模块是如何被调入内核工作的?当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod执行modprobe去加载内核模块。modprobe遍历文件/lib/modules/version/modules.dep来判断是否有其它内核模块需要在该模块加载前被加载。最后modprobe调用insmod先加载被依赖的模块,然后加载该被内核要求的模块。内核模块是如何被调入内核工作的?Insmod将调用init_module系统调用,传入参数(Mo

3、dule.c)Sys_init_module系统调用检查权限后,并查找modules链表,验证模块未被链接。然后分配一个module结构体变量描述该内核模块。如果定义了模块的init方法,则执行init方法。模块机制的特点:减小内核映像尺寸,增加系统灵活性;节省开发时间;修改内核,不必重新编译整个内核。模块的目标代码一旦被链入内核,作用和静态链接的内核目标代码完全等价。最简单的内核模块任一个内核模块需要包含linux/module.h初始化函数init_module(),在模块加载到内核时被调用。init_module()向内核注册模块的功能,申请需要的资料等初始化工作。卸载函数c

4、leanup_module(),在内核模块被卸载时被调用,干一些收尾清理的工作,撤消任何初始化函数init_module()做的事,保证内核模块可以被安全的卸载。printk()函数printk函数在Linux内核中定义并且对模块可用,为内核提供日志功能,记录内核信息或用来给出警告。与标准C库函数printf的行为相似。每个printk()声明都会带一个优先级。内核总共定义了八个优先级的宏,在linux/kernel.h中定义。若你不指明优先级,DEFAULT_MESSAGE_LOGLEVEL这个默认优先级将被采用。信息存在在内核消息缓冲区中,并被定时的添加到文件/var/log/

5、messages,可直接查看,或者用命令dmesg查看。在X-windows下的终端insmod一个模块,日志信息只会记录在日志文件中,而不在终端打印。从内核Linux2.4之后,可以为模块的“初始化”和“卸载”函数起任意的名字。不再必须使用init_module()和cleanup_module()的名字。通过宏module_init()和module_exit()实现。这些宏在linux/init.h中定义。module_init(hello_2_init);module_exit(hello_2_exit);函数必须在宏的使用前定义,否则编译会报错。关于__init和__ex

6、it宏如果该模块被编译进内核,而不是动态加载,则宏__init的使用会在初始化完成后丢弃该函数并收回所占内存。如果该模块被编译进内核,宏__exit将忽略“清理收尾”的函数。这些宏在头文件linux/init.h定义,用来释放内核占用的内存。例如启动时看到的信息“Freeingunusedkernelmemory:236kfreed”,正是内核释放这些函数所占用空间时的打印信息。内核模块证书和内核模块文档说明2.4内核后,引入识别代码是否在GPL许可下发布的机制。在使用非公开的源代码产品时会得到警告。通过宏MODULE_LICENSE(“GPL”),设置模块遵守GPL证书,取消警告

7、信息。宏MODULE_DESCRIPTION()用来描述模块的用途。宏MODULE_AUTHOR()用来声明模块的作者。宏MODULE_SUPPORTED_DEVICE()声明模块支持的设备。这些宏都在头文件linux/module.h定义。使用这些宏只是用来提供识别信息。准备工作顺利编译并且加载第一个“helloworld”模块有时会比较困难。保证系统具备正确的编译器、模块工具、以及其他必要工具。内核目录Documentation/Changes列出了需要的工具版本

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。