第9章 模块的动态加载和系统配置.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:75 大小:215KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

第9章 模块的动态加载和系统配置.ppt

第9章模块的动态加载和系统配置.ppt

预览

免费试读已结束,剩余 65 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第9章模块的动态加载和系统配置第9章模块的动态加载和系统配置9.1模块的动态加载9.1模块的动态加载动态可加载代码的优点是可以让内核保持很小的尺寸并非常灵活。模块机制可以无需重构内核并频繁重新启动来尝试运行新内核代码。用户可以根据自己系统的需要构筑自己的私有内核。Linux源码的公开更是为改造其内核、重建有特殊要求的操作系统提供了可能。模块必须能够找到其需要使用的内核资源。例如模块需要分配内存时,要调用内核的内存分配例程kmalloc()。但在构造模块时并不知道kmalloc()在内存中何处,这样内核必须在使用这些模块前修改模块中对kmalloc()的引用地址。内核在其内核符号表中维护着一个内核资源链表这样当加载模块时它能够解析出模块中对内核资源的引用。Linux还允许存在模块堆栈,它在模块之间相互调用时使用。例如,因为VFAT(VirtuaIFileAllocationTable)文件系统是从FAT(FileAllocationTable)文件系统中扩展而来,VFAT文件系统模块可能需要FAT文件系统模块的服务。某个模块对其他模块的服务或资源的需求类似于模块对内核本身资源或服务的请求。不过此时所请求的服务是来自另外一个事先已加载的模块。当加载模块时,内核就把新近加载模块输出的所有资源和符号添加到内核符号表(Kernel-Symbol-Table)中。在/proc/ksyms.里面的每一个表项代表着一个公共的内核符号,这就是内核符号表。这些内核符号是可以被LKM引用的。LKM中所存取的每一个符号(像函数名)也会被列在这个文件里面。在该文件中可以看到LKM到底可以调用那些函数。当试图卸载某个模块时,内核需要知道此模块是否已经没有被使用,同时它需要有种方法来通知此将卸载模块。模块必须能够在从内核种删除之前释放其分配的所有系统资源,如内核内存或中断。当模块被卸载时,内核将从内核符号表中删除所有与之对应的符号。但是,内核模块的引入也带来了如下问题:但是,内核模块的引入也带来了如下问题:但是,内核模块的引入也带来了如下问题:但是,内核模块的引入也带来了如下问题:但是,内核模块的引入也带来了如下问题:9.1.1模块的加载9.1.1模块的加载9.1.1模块的加载当内核发现有必要加载某个模块时,如用户安装了内核中不存在的文件系统时,内核将请求内核后台进程(kerneld)准备加载适当的模块。这个内核后台进程仅仅是一个带有超级用户权限的普通用户进程。当系统启动时它也被启动并为内核打开了一个进程间通讯(IPC)通道。内核可以利用该通道向Kerneld进程发送任务的执行请求。Kerneld进程的主要功能是加载和卸载模块,另外,该进程也负责其他一些任务,例如打开和关闭PPP链接等。kerneld自身并不执行这些任务,它通过某些程序如insmod来做此工作。因此,该进程实际是代表内核进行调度的代理。执行insmod命令时,必须指定要加载模块的位置;对需求加载的内核模块,通常保存在/lib/modules/kernel-version。和系统的其他程序一样,内核模块实际是经连接的目标文件,但模块是可重定位的,也就是说,为了让装入的模块和已有的内核组件之间可以互相访问,模块不能连接为从特定地址执行的映像文件。模块可以是a.out或elf格式的目标文件。insmod利用一个特权系统调用,可找到内核的导出符号表,符号成对出现,一个是符号名称,另外一个是符号的值,例如符号的地址。内核维护一个由module_list指针指向的module链表,其中第一个module数据结构保存有内核的导出符号表(见图9.1)。并不是所有的内核符号均在符号表中导出,而只有一些特殊的符号才被添加到符号表中。例如,“request_irq”是一个导出符号,它是一个内核例程,可由驱动程序申请控制某个特定的系统中断。利用ksyms命令或查看/proc/ksyms文件内容,可非常方便地看到所有的内核导出符号及其符号值。利用ksyms命令,不仅可以看到内核的所有符号,也可以看到只由以加载模块导出的符号。insmod命令将模块读到它本身的虚拟内存中,然后利用内核导出的符号表,修正尚未解析的对内核例程的引用。这种修正实际是对模块在内存中的映像进行修正,insmod将符号的地址写入模块中适当的位置而实现修正。图9.1装入VFAT和FAT之后的内核模块表insmod命令修正模块对内核符号的引用之后,再次利用特权系统调用请求内核分配足够的物理内存空间保存新的模块。内核将分配新的module数据结构以及足够的内核内存,并将新模块添加在内核模块表的末尾。新的内核模块标记为Uninitialized(未初始化)。图9.1是装入VFAT和FAT模块之后的内核模块表。图中并没有表示出第一个模块,它