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