LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1929|回复: 4

[提问] 内核启动时如何加载模块的?

[复制链接]
发表于 2009-1-2 10:24:45 | 显示全部楼层 |阅读模式
[提问] 内核启动时如何加载模块的?

1。内核启动时不可能将所有编译的模块都加载, 比如网卡驱动我可能编译十几种,内核依据什么配置调用硬件所需的驱动?

2。内核启动时在那一步开始加载内核模块?

3。可否在不重新编译内核的情况下,例如网卡驱动我编译了,但是我又希望不加载它,应该如何处理?

谢谢关注!
发表于 2009-1-3 18:18:03 | 显示全部楼层
你的问题不是一两句话就可以说清楚的.
简单的说:
1:系统启动时是先读BIOS上的信息的,之后通过boot loader加载和解压内核,内核尝试驱动硬件,而目前的内核都具有可读取模块化驱动的功能,这之中的驱动模块是由内核驱动,内核和模块是有相依相的,但是如果一个一个地去读取这些模块的信息,然后定义出相依性是不可行的,所以linux提供了一个解决方案,就是检查/lib/modules/'uname -r'/modules.dep这个档案.这过程同时还会参考模块参数档/etc/modprobe.conf(注:旧版的不是这个文件),这就不会加载错模块了.
2:内核启动时在那一步开始加载内核模块?这个没有确定的定义,因为对于系统的启动流程还没有很死的定义步骤,总的来说是在内核驱动硬件那步,当然我们也是可以手动加载模块的.
3:在不重新编译内核的情况下,驱动只能以模块形式加载,你可以使用lsmod命令去查看加载了多少模块.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-1-4 08:54:41 | 显示全部楼层
谢谢心情好的回复! 感谢你顶我, 兄弟先握个手再说, T_T

1.  /etc/modprobe.conf 在一些版本中已经被废弃, /lib/modules/'uname -r'/modules.dep 我觉得应该是系统已经检测到响应的硬件, 知道需要加载那一个模块之后, 去查找这个文件, 得知是否有其他的关联模块需要一同加载.

2. 从我观察的结果来看, 模块的加载是在intrd.img 里加载的, 但是我不清楚加载模块的机制是什么?

3.在一些版本中可以使用/etc/blacklist, 来禁止模块的加载, 但是仅限于上层模块(我不知道改如何定义这一类模块, 我指的是非硬件驱动模块, 而是系统应用模块), 硬件驱动模块用此方法无法禁用.
回复 支持 反对

使用道具 举报

发表于 2009-1-14 11:18:11 | 显示全部楼层
心情好 说得不错吗!
回复 支持 反对

使用道具 举报

发表于 2009-1-16 18:14:37 | 显示全部楼层
在redhat 9 中系统启动时,执行 用户态的init进程时,其会执行rc.sysinit 和rc脚本 ,好像是在/etc目录下的的init 目录下。

网络模块及其他很多模块就是rc.sysinit 和rc脚本 load的。

不妨关注下。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表