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

hum*_*ace 37 linux arm linux-kernel device-tree reverse-engineering

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

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

如果这个问题的答案还取决于是否首先使用了设备树接口(即 adtb被创建并提供给内核),而不是一些更多的黑客攻击,那么潜在的答案也可以突出另一个方面“我们只是从 vanilla 转移并修补内核以解决我们内核的设备信息问题“-解决方案?

Cir*_*郝海东 51

/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
Run Code Online (Sandbox Code Playgroud)

整数的输出格式是二进制的,所以hexdump是需要的。

dtc -I fs

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

sudo apt-get install device-tree-compiler
dtc -I fs -O dts /sys/firmware/devicetree/base
Run Code Online (Sandbox Code Playgroud)

将 dts 输出到 stdout。

另请参阅:如何列出内核设备树 | Unix 和 Linux 堆栈交换

dtc 在 Buildroot 中

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

动车组 -machine dumpdtb

如果你在 QEMU 中运行 Linux,如果你没有明确地给出 DTB,QEMU 会自动生成 DTB -dtb,因此它也可以直接转储它:

qemu-system-aarch64 -machine virt -cpu cortex-a57 -machine dumpdtb=dtb.dtb
Run Code Online (Sandbox Code Playgroud)

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

在 Linux 内核 v4.19 arm64 上使用此 QEMU + Buildroot 设置进行测试。

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

  • @AnthonyD973 [ABI 文档](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/ABI/testing/sysfs-firmware-ofw?id= HEAD) 采取相反的立场:`用户空间不得直接使用 /sys/firmware/devicetree/base 路径,而应遵循 /proc/device-tree 符号链接。` (2认同)
  • `/sys/firmware/fdt` 是设备树 blob 文件位置 (2认同)

小智 4

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

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

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

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