/proc/modules是否仅列已正确加载内核模块?附相关技术疑问
关于/proc/modules的两个常见问题解答
问题1:若模块第三列值为0,是否表示当前已不在内核中加载?若属实,为何仍存在内核地址?
首先明确:/proc/modules第三列的数值是模块的引用计数,值为0并不代表模块已经完全从内核中移除,而是说明该模块当前没有被任何内核组件或用户进程引用,已经被标记为待卸载状态。
内核的模块卸载流程是异步的:当引用计数降到0时,内核会触发模块的卸载回调,但不会立即释放模块占用的所有内存和地址空间——可能存在以下几种情况导致地址仍存在:
- 内核需要等待某些异步操作完成(比如残留的I/O请求、延迟清理的内核对象)
- 模块的内存页可能还在缓存中,尚未被内核回收复用
- 部分内核子系统的资源释放存在延迟
此时该模块已经不再活跃,不会处理任何新的请求,只是还没完成最后的资源清理步骤,直到内核彻底完成卸载流程后,该模块条目才会从/proc/modules中消失。
问题2:若/proc/modules仅显示当前已加载的内核模块,如何查询开机后自动加载的所有内核模块列表?
可以通过以下几种方式查询系统配置的开机自动加载模块:
- 查看显式加载配置文件:
系统中专门配置开机加载模块的目录是/etc/modules-load.d/和/usr/lib/modules-load.d/,里面的.conf文件直接列出了要在开机时加载的模块。可以用以下命令查看:cat /etc/modules-load.d/*.conf /usr/lib/modules-load.d/*.conf - 检查modprobe配置的隐式加载:
/etc/modprobe.d/和/usr/lib/modprobe.d/下的配置文件可能通过install指令强制加载模块,或者通过依赖关系间接触发加载。可以通过以下命令筛选相关配置:grep -r "install" /etc/modprobe.d/ /usr/lib/modprobe.d/ - 查看udev触发的自动加载:
很多硬件相关模块是通过udev规则在开机检测到硬件时自动加载的,相关规则位于/usr/lib/udev/rules.d/和/etc/udev/rules.d/,可以查找包含RUN+="/sbin/modprobe"的规则:grep -r "modprobe" /usr/lib/udev/rules.d/ /etc/udev/rules.d/ - 查看内核内置模块:
有些模块是直接编译进内核的(而非可加载的.ko文件),会随内核启动直接加载,可以通过以下命令查看所有内置模块:cat /lib/modules/$(uname -r)/modules.builtin
内容的提问来源于stack exchange,提问作者OneAndOnly
相关产品推荐
相关产品推荐

