我最近将供应商提供的嵌入式 Linux 安装在硬件设备上。当我lsmod
在设备命令行上运行时,响应为空。我被引导相信这意味着设备上运行的硬件的驱动程序已内置到内核中,而不是作为 .ko 文件。我的问题是:这个过程是如何发生的?
对流行硬件的支持是否会在后续版本中逐渐集成到内核中,从而取代 .ko 文件? .ko 文件是否仅用于支持在发布时没有内核集成驱动程序支持的新硬件? 以我有限的知识,我以为所有硬件驱动程序都是 .ko 文件的形式,但这显然是错误的。
我对整个过程感到有点困惑,如果能得到澄清我将非常感激,因为我觉得我可能以错误的方式看待了这种情况。
答案1
对于内核加载至关重要的核心驱动程序通常内置于内核中,而其他硬件驱动程序等则作为模块或.ko文件。
这.ko模块通常存储在/lib
根分区的目录下。要使用其中任何一个,内核必须首先能够检测和访问底层存储设备,然后访问其文件系统。因此可以安全地假设没有内置 SATA/SCSI 和 ext2/3/4 支持的内核将无法真正启动 ;)
您可以选择将大多数内置内核驱动程序切换为模块形式。Ubuntu 内核团队决定是否修改 Linux 内核团队的默认配置,并为您下载的库存内核映像包含/排除其他内置驱动程序。
如果你构建了自己的内核,你可以做同样的事情:
- 在上图中,
*
表示内置驱动程序,而M
表示模块。 - 环回设备支持对于启动系统通常至关重要,并且默认内置有环回设备支持。
- 低速 USB 驱动程序(USB 1.0)也默认内置,允许您从 USB 记忆棒启动,但在这里我将其更改为模块。
答案2
在编译核心,你就可以配置安装哪些组件。不仅如此,你还可以选择是否将它们内置到内核中,或者是否将它们作为模块。
例如,许多人在他们的/启动分区。因此,内核必须能够在启动时读取 ext2 文件系统。为了实现这一点,ext2 模块内置于内核本身。
现在,想象一下可用的模块数量。将它们全部内置到内核中是没有意义的,不是吗?这就是为什么你可以将它们构建为单独的.ko模块并随意加载。
答案3
这些取决于您如何配置 Linux 内核。
在编译过程中,您通常可以:
- 编译内核时可以选择是否支持模块(通常支持模块)
- 将驱动程序编译为模块或内置软件,直接嵌入内核
了解 .ko 文件的用途https://stackoverflow.com/questions/10476990/difference-between-o-and-ko-file
输出为空的原因lsmod
在于您有一个单片内核。
列出所有模块(如果存在)的快速方法是运行此命令
find /lib/modules/*/ -type f -iname '*.ko' | less
注意的使用less
,您可以使用您想要的每个寻呼机或将输出重定向到您想要的位置。
答案4
ls /sys/module
似乎包含所有内置和外部模块。
但它似乎还包含一些实际上不是模块的条目:https://unix.stackexchange.com/questions/225706/are-modules-listed-under-sys-module-all-the-loaded-modules
TODO:阅读源代码并更准确地了解其中的内容。
这种方法的优点是您不依赖于能够在/boot
或下找到内核配置/proc/config.gz
。