如何找出嵌入式系统的设备内存映射?

逆向工程 硬件 嵌入式
2021-06-29 10:15:23

在许多嵌入式系统上,与设备的大量通信是通过在软件中读写内存映射 I/O (MMIO) 地址来完成的。假设我可以访问物理设备,以及可以在 IDA 中加载的固件副本,我如何确定哪些设备位于哪些地址?

到目前为止,我只是通过查看代码和字符串引用来进行猜测(例如,如果一个函数打印出“初始化定时器中断”,我可以猜测可能有些地址是用于配置定时器的)。但肯定有些东西必须知道所有设备在内存中的位置,因为有些东西负责将内存读/写路由到正确的设备。

那么,是否有更系统的方法来推导这些信息?

1个回答

但肯定有些东西必须知道所有设备在内存中的位置,因为有些东西负责将内存读/写路由到正确的设备。

在嵌入式设备中,没有什么像 PCI(嗯,它可能存在,但它只是众多硬件块之一)。因此,您不能只是扫描所有可能性来发现现有设备。代码必须知道一切都在哪里。

也就是说,您可能会尝试寻找一些信息来源。

  1. 数据表 - 始终是最佳选择。即使有拼写错误和 c&p 错误,它仍然胜过其他任何东西。请注意,许多制造商针对特定芯片的引脚排列、电气/温度特性以及用户手册(也称为软件或编程手册)提供单独的数据表这些手册在同一系列的许多芯片之间共享。您通常需要后者,但有时前者也可以提供一些有用的提示。

  2. 所有源代码(操作系统,驱动程序等),你可能会发现该设备。即使它不是针对您感兴趣的特定硬件块,标头也可能包含它的定义。

  3. 如果您找不到与您的芯片完全匹配的芯片,请寻找同一系列中的任何产品 - 通常差异只是某些块的大小或端口数量。

  4. 查看该制造商的任何芯片中相同硬件块的文档一些制造商跨架构重复使用他们的 IP 模块——例如,英飞凌在他们的 E-GOLD (C166) 和 S-GOLD (ARM) 基带中使用了几乎相同的 GPIO 模块。瑞萨电子是另一个例子——他们在他们的 ARM 芯片中重用了 SuperH 系列的 IP 块。

  5. 一些硬件在所有架构和制造商之间都是标准化的,例如:PCI、USB 控制器(OHCI、EHCI、XHCI)、SD 主机控制器、eMMC 等。

编辑:有时,芯片外部的硬件可能通过外部总线接口(或外部存储器接口,或许多其他名称)连接。这通常存在于具有至少一百个引脚的较大芯片中。该接口是可编程的,您可以设置哪些地址范围属于哪一组引脚。经常还有所谓的片选(CS) 线,它允许多路复用同一组引脚以访问多个设备,以便一个地址范围将断言 CS1,另一个 CS2 等等。如果你有这样的设置,你需要找出初始化外部接口的代码,或者在运行时转储它的配置。如果你不能这样做,你可以尝试寻找与外部芯片(例如以太网控制器)的寄存器布局相对应的内存访问,对 CPU 的地址空间中的某个基地址进行模数。