是否可以使用正在运行的内核的 /sys 获取设备树的信息?

是否可以使用正在运行的内核的 /sys 获取设备树的信息?

通常对于手臂系统来说,设备树向内核(Linux)提供硬件信息。这些设备树以 dts(设备树源)文件的形式存在,被编译并加载到内核中。问题是我无权访问这样的dts文件,甚至无法访问文件dtb

我可以访问/sys/proc在机器上,我想问这是否允许我“猜测正确的值”以在 dts 中使用?

如果这个问题的答案也取决于是否首先使用设备树接口(即dtb创建并提供给内核)而不是更多的黑客“我们只是从香草转移并修补内核以解决仅适用于我们内核的设备信息问题”-解决方案?

答案1

/proc/device-tree或者/sys/firmware/devicetree/base

/proc/device-tree/sys/firmware/devicetree/base是和 的符号链接内核文档说用户态应该坚持/proc/device-tree

用户空间不得直接使用 /sys/firmware/devicetree/base 路径,而应遵循 /proc/device-tree 符号链接。绝对路径将来可能会改变,但符号链接是稳定的ABI。

然后您可以从文件访问 dts 属性:

 hexdump /sys/firmware/devicetree/base/apb-pclk/clock-frequency

整数的输出格式是二进制的,因此hexdump是必需的。

dtc -I fs

从文件系统获取完整的设备树:

sudo apt-get install device-tree-compiler
dtc -I fs -O dts /sys/firmware/devicetree/base

将 dts 输出到 stdout。

也可以看看:如何列出内核设备树| Unix 和 Linux 堆栈交换

dtc在构建根目录中

Buildroot 有一个BR2_PACKAGE_DTC=y配置可以放入dtc根文件系统中。

QEMU-machine dumpdtb

如果您在 QEMU 中运行 Linux,如果您没有使用 显式指定-dtb,QEMU 会自动生成 DTB,因此它也可以直接使用以下命令转储它:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine dumpdtb=dtb.dtb

如所述:https://lists.gnu.org/archive/html/qemu-discuss/2017-02/msg00051.html

测试用这个 QEMU + Buildroot 设置在 Linux 内核 v4.19 arm64 上。

谢谢Harry Tsai 指出内核文档说这/proc/device-tree是用户态的首选

答案2

我不确定我的理解是否正确。

如果您所在的系统使用 dtb 启动,则您的设备树应该可以在 debugfs 内访问。

您还可以尝试 Pantelis Antoniou 的 dtc 工具,它们包括从 blob 打印 dts 的 fdtdump 和 fdtget。

如果您根本没有设备树并且没有从 dtb 启动,那么您必须自己检查机器代码并将所有设备特定属性和节点添加到您的 dts。没有为此类引导生成“合成”设备树。起点可以是类似的机器或父机器,然后按您的方式逐个系统地工作。

相关内容