内置内核驱动还需要设备树吗?

Built-in kernel driver still need device tree?

如果我将内核驱动程序构建为 module,它可以在 运行 时使用 insmod 或 modprobe 手动插入内核,我很清楚。但是以下关于设备树的说法正确吗?

  1. 如果我将内核驱动程序构建为 module 它将在启动时自动插入到内核中,具体取决于它是否在设备树中列出
  2. 如果我将内核驱动程序构建为 built-in,它将在启动时自动插入内核,而不管设备树如何

2中,没有插入步骤;内置驱动程序是 静态地 内核的一部分(并且没有一刻它不是内核的一部分)

您可以 configure then compile and use a fully static kernel with all useful drivers built-in (so without modules and without initrd). You'll set CONFIG_MODULES=n, you'll never use m in your kernel .config file, and you'll set to y all the stuff needed for your particular hardware and system (e.g. file systems). See also 未回答的问题。我想许多使用 Linux 的嵌入式系统都有一个以这种方式编译的内核,并且不使用任何 initrd。

您可以使用驱动程序(内置驱动程序或已加载的模块),而无需 device tree since you could mknod(2) 将设备放入文件路径中的任何位置。

参见 https://www.devicetree.org/ and notice that older Linux systems did not have any. The device tree is mostly a useful convenience (improving over udev and devfsd)。你可以完全避免它:你可以 运行 一个没有任何设备树的完全静态内核 ,在一个填充有块和字符设备的根文件系统上,比如 Linux 1995 年的发行版做到了。因此,即使在今天,内置内核驱动程序也不需要任何设备树

请注意,旧的 Unix 系统(例如 80 年代中期的 SunOS3,或 1990 年代的 Linux 1.x 内核)没有任何此类内容。那时你只是用适当的驱动程序静态地重新链接内核,然后使用 device files:字符设备或块设备(它们的驱动程序是内核的内置部分)。大多数驱动程序代码都进行了一些初始化,以探测相关硬件的存在(这确实减慢了引导过程)。

顺便说一句,您的问题取决于内核的加载方式、硬件以及加载它的固件。例如,您可以使用嵌入其固件(在 ROM 中)的 Linux 内核构建硬件。

也许最近的 UEFI 一些最近的硬件需要设备树。 AFAIK,BIOS 不需要任何。您可以配置和编译一个静态内核和一个特殊的 init 程序,它们甚至不使用任何设备树,并且使用很少的 预先存在的 设备文件。当然你需要一些根文件系统来提供它们。

另请查看 OSDEV,并查看那里提到的业余操作系统。或者进入 FreeBSD 等......他们不使用(或者至少可以配置为避免)任何设备树 AFAIK。

我可能可以在我的 PC 上启动一个 1995 Linux 发行版(至少如果我有一个软盘单元的话)——至少如果有一个最近为我的硬件量身定制的完全静态内核——它可以在没有任何设备树(当时不存在)。

阅读 Operating Systems: Three Easy Pieces(可免费下载)。

内置内核驱动还需要设备树?是的。设备树的概念与驱动程序是内置的还是编译为模块无关。设备树包含有关硬件的信息。平台总线将该信息传递给相关驱动程序。

这是一篇关于平台总线的简短文章,以及设备树之前的情况:https://www.codeproject.com/tips/1080177/linux-platform-device-driver。设备树排除了硬编码在内核代码中的硬件信息,使代码更具可移植性。