我刚刚读到有关 Linux 处理硬件驱动程序的方式。显然,大多数硬件驱动程序都是预编译到 Linux 内核中的。我对此有一些疑问...
如果 Linux 内核包含几乎所有硬件设备的硬件驱动程序,而运行 Linux 的笔记本电脑只有一定数量的硬件设备,那么 Linux 内核中所有冗余的硬件驱动程序该怎么办?将所有这些驱动程序保留在内核中,并在我们不使用它们时保持它在系统中正常运行,这不是浪费资源吗?
答案1
首先介绍一下历史。在 Linux 的早期,设备驱动程序确实是直接编译到内核中的。事实上,现在仍然可以直接编译驱动程序,许多内核可能仍然通过这种方式包含一些非常常见的驱动程序。它的工作方式是,早期发行版(如 SLS 或 Slackware)附带的通用内核几乎将内核支持的所有驱动程序都直接编译到其中,以便它可以在尽可能广泛的硬件上运行。即便如此,也不可能将它们全部放入,因为其中一些是相互不兼容的。然后,在安装系统后,您将构建自己的内核,仔细检查配置以确保为计算机的所有设备都包含了正确的驱动程序。有时您必须手动编辑驱动程序中的头文件以包含对奇怪硬件的支持 - 使用特定芯片组的以太网卡使用该芯片组的驱动程序,但有时它的实现方式很有趣。然后,您将编译、安装,并希望在重新启动后,您有一个专为您的计算机构建的自定义内核。精简且优化。实际上,您通常会重复此过程几次,包括您错过的内容、添加对您忘记的文件系统的支持或以某种方式调整设置。 冲洗并重复。
幸好,那些日子早已过去。内核长期以来一直支持可加载模块。这些是经过编译的内核驱动程序,以便成为一种可以根据需要加载或卸载的共享库。现在,内核启动的方式是拥有内核文件本身和一个小的压缩文件系统(查看初始化内存文件系统内核模块 (在 Wikipedia 上) 包含内核支持的所有内核模块。内核加载后,会找到其初始文件系统,然后开始加载所需的所有驱动程序。
这段历史省去了一路上的大量工作和汗水。在将所有内置驱动程序都编译到一个巨大的单片内核中和拥有我们今天拥有的全自动驱动程序加载系统之间,我们经历了所有必须明确加载的模块、某些模块的半自动加载等等。
因此,由于现代内核需要加载其所需的绝大多数驱动程序,因此在任何现代 Linux 发行版的内核中都不会出现大量冗余硬件驱动程序占用资源的情况。