hoo*_*enz 5 linux networking init init.d
我正在为网络引导项目构建一个完全自定义的 initramfs,并在此过程中学习了很多关于它的知识,但我对模块的加载感到有些困惑。
我知道modprobe可以用来加载模块,但它如何决定加载哪些模块?
我现在拥有的是 initramfs 在虚拟框中启动并运行 shell。但lsmod显示没有加载模块。我需要init做的是为网络加载正确的模块,以便我可以启动网络。
如果我modprobe e1000真的加载了正确的模块。
在查看 Ubuntu 启动过程时,我看不到 Ubuntu 如何决定它应该加载e1000。我会认为它只是modprobe每个可用的网卡驱动程序,但它似乎并没有这样做。
我猜UDEV与它有关吗?
我知道 modprobe 可用于加载模块,但它如何决定加载哪些模块?
当内核需要一个不在内核中的特性时,内核模块守护进程kmod1执行modprobe来加载模块。modprobe以两种形式之一传递一个字符串。
所以,让我解释一下我在系统中发现的内容,而不是从链接粘贴。
cat /proc/modules - 此命令列出了加载的模块,并且该列表是一个非常大的列表。
现在,在系统启动期间,正如我已经提到的,kmod守护进程执行modprobe加载模块。我们可以用已经讨论过的两种方式之一指定要加载的模块。如果我们指定了通用标识符,它将在/etc/modprobe.conf别名中查找该条目。因此,在 my 中/etc/modprobe.conf,我有一个别名,如下所示。
alias eth0 tg3
Run Code Online (Sandbox Code Playgroud)
因此,我运行以下命令来检查系统中的 tg3 是什么。
-bash-3.2$ cat /proc/modules | grep tg3
tg3 139225 0 - Live 0xf8bd1000
Run Code Online (Sandbox Code Playgroud)
接下来,modprobe查看文件/lib/modules/version/modules.dep,查看是否必须在加载请求的模块之前加载其他模块。此文件由depmod -a模块依赖项创建并包含它。
最后,modprobe用于insmod首先将任何必备模块加载到内核中,然后是请求的模块。modprobe引导insmod至/lib/modules/version/[3],标准目录模块。insmod旨在对模块的位置相当愚蠢,而modprobe知道模块的默认位置,知道如何找出依赖关系并以正确的顺序加载模块。

这些环是由 CPU 创建的,而不是由操作系统创建的。任何操作系统内核都在最高特权级别的 Ring 0 中运行,可以直接与硬件和 CPU 通信。环 1 和环 2 通常用于设备驱动程序。环 3 用于用户空间应用程序(媒体播放器、Web 服务器和用户可以直接与之通信的任何其他内容)。设备驱动程序是用户空间应用程序和硬件之间的“桥梁”。
Linux 内核会不断扫描您所有计算机总线上的任何更改和新硬件。一旦检测到任何总线上的任何变化,魔法就会开始。
Udevd 只是一个站在内核和所有 udev 系统之间的守护进程,并执行一些重要的功能(我稍后会提到它们)。udev 守护进程 (udevd) 在启动时启动,然后读取并解析在 /etc/udev/rules.d/ 中找到的所有规则,并将这些规则保存在内存(udev 数据库)中以供 udev 进一步使用。后来 udevd 开始在 netlink 上侦听来自内核驱动程序核心的 uevents。