虽然我可以使用lsmod
来显示当前活动的内核模块,但是如何才能看到哪些驱动程序是静态构建到内核中并且当前处于活动状态的?
答案1
你可以做一个cat /lib/modules/$(uname -r)/modules.builtin
从内核文档
模块.内置
此文件列出了内核中内置的所有模块。modprobe 使用此文件来确保在尝试加载内置模块时不会失败。
答案2
如果你的 Linux 有一个 /proc/config.gz
这包含所有已构建的模块。将其复制到其他地方并解压。打开文件,所有带有“=M”的都是作为模块构建的。所有带有“=Y”的都是静态构建的。
hwinfo 将列出“驱动程序:”检查上述文件以查看它是否是静态构建的。
仅供参考:所有静态构建的驱动程序始终加载到内存中并准备运行。如果没有相应的硬件,它们将不会执行任何操作,只会占用内存。
答案3
sysfs 模块区域/sys/module
是查看正在运行的内核可见的所有模块的视图。每个模块目录都有一组 sysfs 接口文件,用于通过用户空间查看和管理模块。一般来说,LKM 有一个refcnt
文件,如果与使用它的模块的目录一起使用,则该文件将大于 0。holder
内置模块没有此文件(或许多其他文件,如initstate
和taint
)。
尝试find /sys/module -name refcnt -printf '\n%p: ' -exec cat {} \;
看看哪些正在被使用。
许多模块下都有一个parameters
目录,其中包含可以从用户空间查看和修改的参数。在源代码中,这通常是对module_param
宏的调用。例如,请参阅kernel/printk.c
模块/sys/module/printk/parameters
以了解一些有用的 printk 调整。
下面的实体/sys/module
都是在内核模块框架中设置的。有些是硬件驱动程序,有些是 netfilter,有些是文件系统,有些是调试等。
答案4
我正要对 cybernard 的回应发表评论,但由于没有这个特定 StackExchange 服务的声誉,我无法发表评论。
为了快速检查/proc/config.gz
某个特定模块,您不需要将其解压缩到任何地方(当您不想写入设备的任何分区时很有用):
$ gunzip -c /proc/config.gz | grep 8021Q
CONFIG_VLAN_8021Q=y