操作系统的内核模块全面解析呢
前一页[1][2][3][4] 一、模块简介 Windows NT是一种微内核的结构,其内核的功能块被划分成独立的模块,在这些功能块之间有严格的通信机制;而Linux则不同,它是一种monolithic(单一大块)结构,也就是说,整个内核是一个单独的、非常大的程序。在这种结构中,部件的添加和删除都相当麻烦,需要重新编译内核。为了解决这个问题,不知道从哪个版本的内核开始,Linux引入了一种称为module(模块)的技术,可以把某些功能代码作为模块动态装载到内核中使用。 模块是一种目标对象文件,需要在内核空间执行,可以把它看作是一组已经编译好而且已经链接成可执行文件的程序。在需要的时候,内核就会实用某种方法调用这些程序来执行特定的操作,实现特定的功能。内核在内核符号表中维护了一个模块的链表,每个符号表对应一个模块,在把模块加载进内核时正确地对其进行解释,并将模块作为内核的一部分来执行;加载进内核中的模块具有所有的内核权限。模块可以在系统启动时加载到系统中,也可以在系统运行的任何时刻加载;在不需要时,可以将模块动态卸载。这样就不用每次修改系统的配置时都要重新编译内核了。 二、模块的优缺点 内核模块的这种动态装载特性具有以下的优点: 1、可以把内核映像文件保持在最小。在编译内核时可以选择把一部分内容当成模块进行编译,这样在最终生成的内核映像文件中就可以不包含这部分内容,从而生成最小的内核映像文件。 2、灵活性好。如果需要实用新的模块,不必重新编译内核,只要把新的模块编译后装载进系统中就可以了。如果对内核源程序进行了修改,也不需要重新编译整个内核,只需要修改对应的部分就可以了。 但是,内核模块的引入也带来了一些问题: 1、这种动态加载的特性不利于系统的性能和内存的利用,会带来负面的影响。 2、装入内核的模块和其他内核部分一样具有最高的权限,使用不当就可能引起系统的崩溃。 3、内核版本和模块版本的不兼容也会导致系统的崩溃,因此必须进行严格的版本检查,这样就使模块的编写变得更加复杂了。 4、有些模块要使用其他模块(例如VFAT就要使用FAT)的内容,模块之间存在一定的依赖关系,这样模块的实用就复杂化了。 由于模块的这种动态装载/卸载的特性,在Linux中大部分设备驱动程序都是使用模块来编写的,例如文件系统(minix、msdos、isofs、smbms、nfs、proc等等)、SCSI设备驱动程序、以太驱动程序、CD-ROM驱动程序等等。下面让我们介绍一下模块的使用方法。 三、模块的使用 1、模块的查询 我们可以使用lsmod命令来了解系统中现在装载进来了哪些模块。例如,在笔者机器上执行的结果为(注意,以下介绍的这些命令(包括lsmod)只有超级用户才可以执行): Module Size Used by lockd 30344 1 (autoclean) sunrpc 52132 1 (autoclean) [lockd] rtl8139 11748 1 (autoclean)
其中Module列是模块的名字,Size是显示的模块的大小,Used by列表示引用次数,圆括号中的autoclean表示该模块可以在空闲时自动卸载,中括号中的[lockd]表示模块lockd会引用sunrpc模块的内容。 2、模块的装载 模块的装载有两种方法:一种是实用insmod命令手工加载模块,第二种方法是使用内核守护进程kerneld在需要的时候动态装载。insmod命令的格式为: insmod //modulename.o
值得注意的是,insmod命令需要知道模块存放的位置,这样才能在内核符号表中进行解析。模块可以位于当前路径中,也可以在insmod命令中指明绝对路径,另外还有几个相关的配置文件可以说明模块的位置(见后文中的介绍)。 kerneld是一个标准的守护进程,具有超级用户的权限,其主要功能是加载和卸载核心模块, 但是它还可以执行其他任务, 如通过串行线路建立PPP连接并在适当时候关闭它。kerneld自身并不执行这些任务,它通过某些程序如insmod来做此工作。它只是内核的代理,为内核进行调度。这个守护进程仅仅是一个带有超级用户权限的普通用户进程。当系统启动时它也被启动并为内核打开了一个进程间通讯(IPC)通道,内核需要执行各种任务时就实用这个IPC来向kerneld发送消息。例如,如果内核请求现在还没有装载到系统中的文件系统,那么就通知kerneld装载这个文件系统,然后内核就可以使用这个文件系统了。在模块空闲时(即没有其他进程使用这个模块时),kerneld还可以动态卸载这个模块。 需要注意的是,如果模块之间有某种引用关系,那么装载模块时必须遵循一定的次序。例如,上面lsmod显示的结果中lockd模块要引用sunrpc的内容,那么必须首先装载sunrpc之后才能装载lockd,否则就会出错。 3、模块的卸载 我们可以使用rmmod命令把模块从系统中卸载出去,该命令的格式为: rmmod modulename
合肥男科好医院冠心病合并高血压吃什么药
贵阳男性功能障碍治疗费用多少钱
- 成功前的铺垫:一个人若能做这3点,他一生的高度将不会太低
- 为啥你家大头不好带?多是因为怀孕时你做过这些事,妈妈都该重视
- 山东首批省级考古遗存公园立项名单公布
- 立了秋,再贵也要特别吃这肉,滋养润燥,好吃不上火,满满的胶原
- 小时候上新东方的课,小时候了买新东方的货
- 立秋后这菜1元1斤,晒一晒价格暴跌50倍,放1年不坏,冬天焖肉特香
- 口罩!口罩!口罩!杭州卫健委最新提示
- 《太平广记》走红带火国风女装 “仙气”、“国风”成热搜词
- 【第一直播间】针灸科、亚健康科与妇科他的团队的联合主题直播来啦!
- 新书架 | 为什么长江如此迷人?关于长江的一次严肃的“水边调查”
- 给狗狗洗澡的时候有哪些地要特别留意的位置
- 具有什么样特征的古代牧羊犬不能购买位置