⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modules(模块).htm

📁 这是我做linux系统初始化过程分析时在网上收集到的资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
        <BR><BR>除了写的不好的可加载模块可能破坏操作系统之外,还有另一个危险。如果你加载一个为比你当前运行的核心要早或迟的核心建立的模块会发生什么?如果这个模块执行一个核心例程而提供了错误的参数就会引起问题。核心可以选择防止这种情况,当模块加载的时候进行严格的版本检查。 
        <BR><BR>  <BR><BR>12.1 Loading a Module(加载一个模块) <BR><BR>  
        <BR><BR>用两种方法可以加载一个核心模块。第一种使用insmod命令手工把它插入到核心。第二种,更聪明的方法是在需要的时候加载这个模块:这叫做按需加载(demand 
        loading)。当核心发现需要一个模块的时候,例如当用户安装一个不在核心的文件系统的时候,核心会请求核心守护进程(kerneld)试图加载合适的模块。 
        <BR><BR>Kerneld和insmod,lsmod以及rmmod都在modules程序包中。 <BR><BR>  
        <BR><BR>核心守护进程通常是拥有超级用户特权的一个普通的用户进程。当它启动的时候(通常是在系统启动的时候启动),它打开一个通向核心的IPC通道。核心使用这个连接向kerneld发送消息,请求它执行大量的任务。Kerneld的主要功能是加载和卸载核心模块,但是它也可以执行其它任务,比如需要的时候在串行线上启动PPP连接,不需要的时候把它关闭。Kerneld本身并不执行这些任务,它运行必要的程序比如insmod来完成工作。Kerneld只是核心的一个代理,调度它的工作。 
        <BR><BR>参见include/linux/kerneld.h <BR><BR>  <BR><BR>insmod 
        命令必须找到它要加载的被请求的核心模块。按徐加载的核心模块通常放在/lib/mmodules/kernel-version目录里边。核心模块和系统中的其它程序一样是连接程序的目标文件,但是它们被连接成可以重定位的映像。就是没有连接到特定地址去运行的映像。它们可以是a.out或elf格式的目标文件。Insmod指向一个特权的系统调用,找出系统的输出符号。它们以符号名称和值(例如它的地址)的形式成对存放。核心的输出符号表放在核心维护的模块列表中的第一个module数据结构,用module_list指针指向。只有在核心编译和连接的时候特殊指定的符号才加到这个表中,而并非核心的每一个符号都输出它的模块。例如符号“request_irq”是一个系统例程,当一个驱动程序希望控制一个特定的系统中断的时候必须调用它。在我当前的核心上,它的值是0x0010cd30。你可以检查文件/proc/ksyms或使用ksyms工具简单地查看输出的核心符号和它们的值。Ksyms工具可以向你显示所有的输出的核心符号或者只显示哪些加载模块输出的符号。Insmod把模块读取到它的虚拟内存,使用核心的输出符号来整理这个模块对于核心例程和资源的未解析的引用。这个整理过程是用向内存中的模块映像打补丁的方式进行,insmod物理上把符号的地址写到模块的合适的位置。 
        <BR><BR>参见kernel/module.c kernel_syms() include/linux/module.h <BR><BR>  
        <BR><BR><BR><BR>当insmod整理完了模块对于输出的核心符号的引用之后,他向核心请求足够的空间放置新的核心,又是通过特权的系统调用。核心分配一个新的module数据结构和足够的核心内存来存放这个新的模块,并把它放置到核心的模块列表的最后。这个新的模块被标记为UNINITIALIZED。图12.1显示了核心模块列表的后面两个模块:FAT和VFAT被加载到了内存。图中没有显示的有列表的第一个模块:这是一个伪模块,用于放置核心的输出符号表。你可以使用命令lsmod列出所有加载的核心模块和它们之间的依赖关系。Lsmod只是简单地把从核心module数据结构列表中提取的/proc/modules重新安排了格式。核心为模块分配的内存映射到insmod进程的地址空间,所以它可以访问它。Insmod把模块拷贝到分配的空间,并把它重定位,这样它就可以从被分配的核心地址运行。必须进行重定位,因为一个模块不能期待在两次被加载到相同的地址或者在两个不同的Linux系统上被加载到相同的地址。这一次,重定位又关系到要用适当的地址为模块的映像打补丁。 
        <BR><BR>参见kernel/module.c create_module() <BR><BR>  
        <BR><BR>新的模块也向核心输出符号,Insmod建立一个输出映像表。每一个核心模块必须包含模块初始化和模块清除的历程,这些符号必须是专用的而不是输出的,但是insmod必须知道它们的地址,能把它们传递给核心。所有这些做好之后,Insmod现在准备初始化这个模块,它执行一个特权的系统调用,把这个模块的初始化和清除例程的地址传递给核心。 
        <BR><BR>参见kernel/module.c sys_init_module() <BR><BR>  
        <BR><BR>当一个新的模块加到核心的时候,它必须更新核心的符号表并改变被新的模块使用的模块。其它模块依赖的模块必须在它们的符号表之后维护一个引用列表,用它们的module数据结构指向。图12.1显示了VFAT文件系统模块依赖于FAT文件系统模块。所以FAT模块包含一个到VFAT模块的引用:这个引用在VFAT模块加载的时候增加。核心调用模块的初始化例程,如果成功,它开始安装这个模块。模块的清除例程的地址保存在它的module数据结构中,当这个模块卸载的时候核心会去调用。最后,模块的状态被设置为RUNNING。 
        <BR><BR>  <BR><BR>  <BR><BR>12.2 Unloading a Module <BR><BR>  
        <BR><BR>模块可以使用rmmod命令删除,但是kerneld可以把所有不用的按需加载的模块从系统中删除。每一次它的空闲计时器到期的时候,kerneld执行系统调用,请求从系统删除所有的不需要的按需加载的模块。这个计时器的值由你在启动kerneld的时候设定:我的kerneld每180秒检查一次。如果你安装了一个iso9660 
        CD ROM而你的iso9660文件系统是一个可加载模块,那么,在CD ROM卸载不久,iso9660模块会从核心中删除。 <BR><BR>  
        <BR><BR>如果核心中的其它组件依赖于一个模块,它就不能被删除。例如如果你安装了一个或更多的VFAT文件系统,你就不能卸载VFAT模块。如果你检查ls输出,你会看到每一个模块关联一个计数器。例如: 
        <BR><BR>  <BR><BR>Module: #pages: Used by: <BR><BR>msdos 5 1 
        <BR><BR>vfat 4 1 (autoclean) <BR><BR>fat 6 [vfat msdos] 2 (autoclean) 
        <BR><BR>  
        <BR><BR>这个计数器(count)是依赖于这个模块的核心实体的数目。在上例中,vfat和msdos都依赖于fat模块,所以fat模块的计数器是2。Vfat和msdos模块的依赖数都是1,因为它们都有一个安装的文件系统。如果我加载另外一个VFAT文件系统,那么vfat模块的计数器会变成2。一个模块的计数器放在它的映像的第一个长字中(longword)。 
        <BR><BR>  
        <BR><BR>因为它也放置AUTOCLEAN和VISITED标志,所以这个字段有一些轻微过载。这些标志都用于按需加载模块。这些模块被标记为AUTOCLEAN,这样系统可以识别出哪些它可以自动卸载。VISITED标志表示这个模块被一个或多个系统组件使用:只要另一个组件使用它就设置这个标志。每一次kerneld请求系统删除不用的按需加载的模块的时候,它都查看系统中所有的模块,找到合适的候选。它只查看标记为AUTOCLEAN而且状态是RUNNING的模块。如果这个候选的VISITED标记被清除,那么它就删除这个模块,否则它就清除这个VISITED标记,继续查找系统中的下一个模块。 
        <BR><BR>  
        <BR><BR>假设一个模块可以被卸载,就调用它的清除例程(cleanup),让它释放它所分配的核心资源。这个module数据结构被标记为DELTED,从核心模块列表中删除。任何其它的它所依赖的模块的引用表被修改,这样它们不再把它当作一个依赖者。这个模块需要的所有的核心内存被释放。 
        <BR><BR>参见kernel/module.c delete_module() <BR><BR><BR>
        <DIV align=right>发布人:netbull&nbsp;来自:非常Linux&nbsp;</DIV><BR></UL><IMG 
      src="Modules(模块).files/line.jpg"><BR>
      <FORM action=post.php?skin=reart&amp;ID=2085 method=post>
      <UL>-- 发表评论 --<BR>&nbsp;昵称:<INPUT name=name>&nbsp;Email:<INPUT 
        name=email><BR>&nbsp;内容:<BR><TEXTAREA name=content rows=5 cols=56></TEXTAREA><BR>&nbsp;&nbsp;<INPUT type=submit value=确定回复>&nbsp;<INPUT type=reset value=清除></UL></FORM><IMG 
      src="Modules(模块).files/line.jpg"><BR>
      <UL>
        <LI>以下是对此文的评论:<BR><BR></LI></UL></TD><!--第三列-->
    <TD vAlign=top align=left width="25%">&nbsp;<IMG 
      src="Modules(模块).files/online.jpg" border=0> 
      <UL>
        <LI><A href="http://www.heblinux.org/addnews.php" 
        target=_blank>新闻发布</A><BR><BR>
        <LI><A href="http://www.heblinux.org/addart.php" 
        target=_blank>文献发布</A><BR><BR>
        <LI><A href="http://www.heblinux.org/addsoft.php" 
        target=_blank>软件发布</A><BR><BR>
        <LI><A href="http://www.heblinux.org/manger.php" 
        target=_blank>软件管理</A><BR></LI></UL><IMG height=5 
      src="Modules(模块).files/tabledi2.jpg" width="100%"><!--下载排行--> &nbsp;<IMG 
      src="Modules(模块).files/download.jpg" border=0> <BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=676">Red Hat 
      Linux</A>&nbsp;(78904)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=93">星际译王1.31版</A>&nbsp;(36834)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=219">Oracle9i 
      Enterprise</A>&nbsp;(36781)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=785">kylix</A>&nbsp;(35589)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=287">AOL 
      server</A>&nbsp;(27226)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=969">RedHat 
      中文环境</A>&nbsp;(25499)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=647">Chinput</A>&nbsp;(23572)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=1041">中软Linux</A>&nbsp;(21135)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=946">RedHat Linux 
      7.1正式</A>&nbsp;(20829)<BR>&nbsp;<A 
      href="http://www.heblinux.org/view.php?skin=soft&amp;id=134">XteamLinux</A>&nbsp;(20642)<BR><IMG 
      height=5 src="Modules(模块).files/tabledi2.jpg" width="100%"> 
      <!--文摘分类-->&nbsp;<IMG src="Modules(模块).files/artstyle.jpg" border=0> 
      <BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=1">内核分析</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=2">网络技术及应用</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=3">应用编程</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=4">硬件应用</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=5">软件应用</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=6">系统管理</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=7">数据库应用</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=8">系统安全</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=9">Linux中文化</A><BR>&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/arttype.php?dno=10">市场与观点</A><BR><IMG 
      height=5 src="Modules(模块).files/tabledi2.jpg" width="100%"> <BR><!--合作伙伴-->&nbsp;<IMG src="Modules(模块).files/friends.jpg" border=0> 
      <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A href="http://www.5ilinux.com/" 
      target=_blank>我爱linux</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.heblinux.org/" 
      target=_blank>河北LINUX协会</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.xteamlinux.com.cn/" 
      target=_blank>冲浪软件下载中心</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://cosoft.org.cn/html/" 
      target=_blank>共创联盟</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.coventive.com.cn/" 
      target=_blank>XLinux</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.it365.net/" 
      target=_blank>诺金软件电脑网络</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.ch2000.com.cn/" 
      target=_blank>中文2000软件</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.csuu.com/" 
      target=_blank>中国Unix联盟</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://freewares.cn/" 
      target=_blank>自由软件在中国</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.pconline.com.cn/pcedu" 
      target=_blank>太平洋电脑信息网</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.linuxaid.com.cn/" 
      target=_blank>LinuxAid</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://www.cosoft.org.cn/" 
      target=_blank>共创软件联盟</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://wsdn.org/" 
      target=_blank>WEB程序开发网络</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://linux.softhouse.com.cn/" 
      target=_blank>软件屋Linux之家</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://ljb.vpnet.cn/" 
      target=_blank>随意网络</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A 
      href="http://linux.ccidnet.com/" 
  target=_blank>赛迪网Linux专区</A><BR></TD></TR></TBODY></TABLE>
<CENTER>Completed in 0.0579190254211&nbsp;seconds</CENTER>
<CENTER>COPYRIGHT 2002-2003 <FONT color=#9b2626>LinuxByte.net</FONT> <A 
href="mailto:oneteam@mail.linuxbyte.net">联系本站</A></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -