欢迎来到天天文库
浏览记录
ID:39596905
大小:1.11 MB
页数:37页
时间:2019-07-06
《《模块编程实验》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、模块编程实验7.2.1模块的组织结构7.2.2模块的编译7.2.3模块的加载7.2.4模块的卸载7.2.5模块链接到内核的示意图7.2.6模块管理程序中的文件操作7.2.7i386的寄存器7.1实验目的7.2准备知识模块作为一种抽象数据类型,它具有一个可以通过静态内核中断的接口。最小的模块结构必须包括两个函数:init_module()和cleanup_module(),它们在系统加载模块和卸载模块时被调用。也可以编写一个只包括这两个函数的模块,这样该模块中唯一会被调用的函数就是模块被加载时所调用的函数init_module(
2、)和模块被卸载时所调用的函数cleanup_module()。并且用函数init_module()来启动模块加载期间的操作,用函数cleanup_module()来停止这些操作。由于模块可以实现相当复杂的功能,故可以在模块中加入很多新函数以实现所期望的功能。不过加入模块的每个新函数都必须在该模块加载到内核中时进行注册。若该模块是静态加载的,则该模块的所有函数都是在内核启动时进行注册;若该模块是动态加载的,则这些新函数必须在加载这个模块时动态注册。当然,如果该模块被动态卸载了,则该模块的函数都必须从系统中注销。通过这种方式,当这
3、个模块不在系统中时,就不能调用该模块的函数。其中注册工作通常是在函数init_module()中完成的,而注销工作则是在函数cleanup_module()中完成。7.2.1模块的组织结构#include//说明是个内核功能#include//声明是一个模块……//其它header信息intinit_module(){……//加载时,初始化模块的编码}…………//期望该模块所能实现的一些功能函数,如open()、release()、write()、read()、i
4、octl()等函数……voidcleanup_module(){……//卸载时,注销模块的编码}一般编译模块文件的命令格式如下:#gcc-O2–g-Wall-DMODULE-D__KERNEL__-c–f-I/usr/src/linux-2.4/includefilename.c//filename.c为自己编写的模块程序源代码文件7.2.2模块的编译7.2.3模块的加载7.2.4模块的卸载图7-1模块链接到内核的示意图7.2.5模块链接到内核的示意图在内核是用一个file结构来识别模块,而且内核使用file_operatio
5、ns结构来访问模块程序中的函数。file_operations结构是一个定义在中的函数指针表。管理模块的文件操作,通常也称为“方法”,它们都为structfile_operations提供函数指针。在structfile_operations中的操作一般按如下顺序出现,除非特别说明,一般它们返回0值时表示访问成功;发生错误时会返回一个负的错误值(目前共有13个操作):int(*lseek)()、int(*read)()、int(*write)()int(*readdir)()、int(*select)(
6、)、int(*ioctl)()int(*mmap)()、int(*open)()、void(*release)()int(*fsync)()、int(*fasync)()int(*check_media_change)()int(*revalidate)()7.2.6模块管理程序中的文件操作structfile_operationsmodulename_fops={NULL,//modulename_lseek,改变模块结构中的操作位置。modulename_read,modulename_write,NULL,//modul
7、ename_readdir,读取某个子目录中的内容。NULL,//modulename_select,允许应用程序响应来自模块的事件。NULL,//modulename_ioctl,应用程序通过I/O控制系统的系统调用来控制模块行为。NULL,//modulename_mmap,模块地址空间到用户地址空间的映射。modulename_open,modulename_release,NULL,//modulename_fsync,同步内存与磁盘上的数据状态,把输出缓冲区里尚未写到磁盘的数据写出去。NULL,//modulenam
8、e_fasync,改变模块行为。NULL,//modulename_check_media_change,检查自上次操作后,介质(软盘和CD-ROM)是否更换。NULL//modulename_revalidate,若更换了介质,则更新信息。}void(*release)(s
此文档下载收益归作者所有