Linux 版 (精华区)
发信人: tcpip (高级草包), 信区: Linux
标 题: 来点真格的--3(转载)
发信站: 哈工大紫丁香 (2000年06月10日14:29:04 星期六), 转信
【 以下文字转载自 Computer 讨论区 】
【 原文由 tcpip 所发表 】
来点真格的--3
4.linux的模块思想(modules)
Linux核心是一种monolithic类型的内核,即单一的大程序,核心中
所有的功能部件都可以对其全部内部数据结构和例程进行访问。核
心的另外一种形式是微内核结构,此时核心的所有功能部件都被拆
成独立部分, 这些部分之间通过严格的通讯机制进行联系。这样通
过配置进程将新部件加入核心的方式非常耗时。Linux可以让我们可
以随意动态的加载与卸载操作系统部件。Linux模块就是这样一种可
在系统启动后的任何时候动态连入核心的代码块。当我们不再需要
它时又可以将它从核心中卸载并删除。Linux模块多指设备驱动、伪
设备驱动, 如网络设备和文件系统。 insmod和rmmod就是用来干这个
的。
我记得灯泡曾经说过,linux增加点新驱动都要重新编译内核,当时
我没有回答,现在说吧,不用每次都编译进内核了。自己insmod .o
的东西就可以了。但是你硬要把(M)换成(*)也没有人反对。毕竟动态
加载的东西还是跟编进核心的有一些区别。动态加在好处是可以保持
核心非常小。内核的代码总共有大约20M,但是仔细编译出来的(压缩
过)的可以保持在400K左右。尽管使用模块很自由,但是也有可能同
时带来与核心模块相关的性能与内存损失。可加载模块的代码一般有
些长并且额外的数据结构可能会占据一些内存。同时对核心资源的间
接使用可能带来一些效率问题。我的看法是,如果某种设备只是偶尔
用一下的话,编成.o的东西比较合算,如果从开机到关机都需要这个
设备的驱动,那最好编进内核。
可加载模块具有使操作系统崩溃的能力,比较恐怖的东西呀,这些跟
核心打交道的东西必须万分小心。核心应该使用严格的版本控制来对
加载模块进行检查以防止一些不必要的错误。.o的东西一般对内核的
版本依赖比较大,虽然insmod --force可以忽略版本检测,但是负面
影响不可小视。核心模块的加载方式有两种。一种是上面用到过的用
insmod命令手工加载模块。另外一种则是在需要时加载模块;称它为
请求加载。当核心发现有必要加载某个模块时,核心将请求核心后台
进程(kerneld)准备加载适当的模块。这个核心后台进程仅仅是一个
带有超级用户权限的普通用户进程。当系统启动时它也被启动并为核
心打开了一个进程间通讯(IPC)通道。核心需要执行各种任务时用它
来向kerneld发送消息。
模块可以通过使用rmmod命令来删除, 但是请求加载模块将被kerneld
在其使用记数为0时自动从系统中删除。 kerneld在其每次idle定时器
到期时都执行一个系统调用以将系统中所有不再使用的请求加载模块
从系统中删除。具体一点就是:这样如果你安装一个iso9660 CDROM并
且你的iso9660文件系统是一个可加载模块, 则在卸载CD ROM后的很短
时间内此iso9660模块将从核心中删除。
--
"这一千多年没写诗了?"
"写了, 不过只写了两句."
"千年得两句, 一定是万古丽句了. 念来听听."
"好吧, 我现丑了" 太白星清了清嗓子, 浑厚的男中音在天庭响起:
大海啊, 都是水;
骏马啊, 四条腿;
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: tcpip.hit.edu.cn]
--
※ 转载:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: tcpip.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.002毫秒