Tim*_*Tim 16 linux ubuntu kernel-modules
在 Ubuntu 14.04 上,我发现当我不插入外部无线适配器时,其模块rt2800usb仍然显示在lsmod.
什么时候自动加载驱动模块?是在设备连接到计算机时,还是在操作系统启动时?
何时自动卸载驱动程序模块?是在设备与计算机断开连接时,还是在操作系统关闭时?
Gil*_*il' 13
当内核检测到新设备时,它会运行程序modprobe并向其传递一个标识该设备的名称。大多数设备通过供应商和型号的注册编号进行识别,例如PCI或USB标识符。该modprobe程序查阅模块别名表以查找包含该特定设备的驱动程序的文件的名称。类似的原则适用于非硬件设备的驱动程序,例如文件系统和加密算法。有关更多详细信息,请参阅Debian 在重启后未检测到串行 PCI 卡/lib/modules/VERSION/modules.alias
一旦 modprobe 识别出哪个模块文件 ( .ko) 包含所请求的驱动程序,它就会将模块文件加载到内核中:模块代码被动态加载到内核中。如果模块加载成功,它将出现在lsmod.
当内核检测到新的可热插拔硬件时,会自动加载模块,例如,当您连接 USB 外围设备时。操作系统还会在启动早期枚举系统上存在的所有硬件,以便为启动时存在的外围设备加载驱动程序。
也可以使用modprobeorinsmod命令手动请求加载模块。大多数发行版都包含一个启动脚本,用于加载 中列出的模块/etc/modules。加载模块的另一种方法是如果它们是模块的依赖项:如果模块 A 依赖于模块 B,则modprobe A在加载 A 之前加载 B。
加载模块后,它会一直保持加载状态,直到明确卸载,即使使用该驱动程序的所有设备都已断开连接。很久以前,有一种自动卸载未使用模块的机制,但如果我没记错的话,当 udev 出现时,它被删除了。我怀疑自动模块卸载不是一个常见的功能,因为往往需要它的系统大多是具有大量内存的台式 PC(在驱动程序代码的规模上)。
当系统通过初始 RAM 磁盘 initrd启动时加载模块。基本原理部分指出:
许多 Linux 发行版都附带一个单一的通用 Linux 内核映像——发行版的开发人员专门为在各种硬件上启动而创建的映像。此通用内核映像的设备驱动程序作为可加载内核模块包含在内,因为将许多驱动程序静态编译到一个内核中会导致内核映像大得多,可能太大而无法在内存有限的计算机上启动。这就提出了在启动时检测和加载挂载根文件系统所需的模块的问题,或者就此而言,推断根文件系统的位置或内容。
Ubuntu 像许多其他发行版一样,选择将每个设备驱动程序加载到这个 initrd 中,无论是否需要驱动程序,也不管系统上是否存在该设备。正如 Giles 指出的那样,整个东西都被加载到 RAM 中,然后在启动时检测使用的模块,并将未使用的模块从 RAM 中删除。使用这种方法可确保 Ubuntu 始终在任何系统上启动,而不管设置如何。Ubuntu 正在模仿使用微内核构造的单体内核。看看这个工作的原因
rt2800usb将始终在启动时加载,因为该模块包含在Gilles 提到的initramfs中。initramfs 是 initrd 的后继者,因此它将始终由 显示lsmod。请注意,您可以使用modprobe后跟模块名称将新编译的模块插入内核。作为测试,请拔掉无线适配器重新启动系统。如果一切顺利,模块将不会在lsmods 输出中列出,因为在启动期间,由 initramfs 启动的检测过程和 init sstem 在探测期间没有找到设备,并且模块已从 RAM 中删除。
rmmod, 或modprobe -r后跟模块名称的命令。在下次启动时,模块将被重新加载。看上面。在大多数情况下,模块不会动态移除,因为这会禁用热插拔,即一旦模块被移除,重新插入时无法再次检测到使用它的设备。为了从 中删除模块lsmod,您必须从通过重新编译内核而创建的 initramfs 映像中删除它,而无需选择模块,然后重新构建映像。这样做会禁用对所述模块的所有检测。
| 归档时间: |
|
| 查看次数: |
14472 次 |
| 最近记录: |