【问题标题】:Built-in kernel driver still need device tree?内置内核驱动还需要设备树吗?
【发布时间】:2018-03-14 08:22:26
【问题描述】:

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

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

【问题讨论】:

标签: linux linux-kernel kernel linux-device-driver device-tree


【解决方案1】:

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

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

【讨论】:

  • 但是你可以运行一个没有任何设备树的系统
  • 没错,但这与将驱动程序构建为模块还是内置于内核时是否需要设备树有什么关系?
  • 不使用任何模块(也不需要任何initrd)很容易
  • 据我了解,我不认为这是被问到的。不过你说的是对的。
  • 取决于您对完全静态的定义。您可以选择将设备信息硬编码到内核代码中,从而不需要设备树。但这与驱动程序是否内置于内核无关:)
【解决方案2】:

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

您可以configure 然后编译并使用一个完全静态的内核 内置所有有用的驱动程序(所以没有模块没有initrd)。你将设置CONFIG_MODULES=n,你永远不会在你的内核.config文件中使用m,你将设置为y你的特定硬件和系统(例如文件系统)所需的所有东西。另请参阅this 未回答的问题。我猜许多使用 Linux 的嵌入式系统都有这样编译的内核并且不使用任何 initrd。

您可以使用不带device tree 的驱动程序(内置驱动程序或已加载的模块),因为您可以将设备mknod(2) 放入任何地方的文件路径中。

请参阅https://www.devicetree.org/ 并注意旧的 Linux 系统没有。设备树主要是一个有用的便利(改进了udevdevfsd)。而且您可以完全避免它:您可以在没有任何设备树的情况下运行完全静态的内核,在一个填充了块和字符设备的根文件系统上,就像 1995 年的 Linux 发行版所做的那样。因此,即使在今天,内置内核驱动程序也不需要任何设备树

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

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

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

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

我可能可以在我的 PC 上启动一个 1995 年的 Linux 发行版(至少如果我有一个软盘单元)——至少使用为我的硬件量身定制的最新完全静态内核——并且它可以在没有任何设备树的情况下工作(在那个时间不存在)。

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

【讨论】:

  • 那么它是否仍然取决于驱动程序的编写方式,它仍然可能从设备树节点中查找驱动程序参数,如果设备树上不存在驱动程序可能会失败?
  • 我什至不明白所有这些问题。单独询问。
  • 这个答案有几个错误。 “内置驱动程序......并且没有任何时候它不是它的一部分” -- 内置驱动程序将不会被使用(即甚至不会调用它的探测函数)如果驱动程序未在设备树中引用。 “它主要是一种有用的便利” -- 并非 Linux 中的每个 OS 或 Arch 都使用 DT,但 DT 不仅仅是一个“有用的便利”;有必要配置系统,即有适当的驱动程序来支持硬件。对于 ARM 上的旧 Linux,配置是使用 ATAG 和平台文件(硬编码配置)完成的。
  • 包含很多不相关的信息
  • AFAIK,即使在今天,您也可以在没有任何设备树的情况下运行内核。设备树实际上是可选的。你可以构建一个没有任何系统的系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 2018-05-23
  • 2013-08-22
  • 1970-01-01
相关资源
最近更新 更多