我是 ARM 新手,正在寻找基于 ARM 检测平台内存映射的方法。之前我在 x86 中工作很少,可以使用一些 BIOS 调用找出内存映射。
尽管 ARM 中没有 BIOS,但我们可以在 ARM 中执行相同的操作。
ARM中是否存在任何指令来查找内存映射?
如何找到 ARM CPU 指南的内存映射:
或者作为一种快捷方式:如果您的平台供应商提供了一个工具链来为其编译代码,请创建一个虚拟项目并在链接器文件中查找内存布局......
收集这些信息:
尽管 Microsoft 确实为运行 Windows 的系统指定了 UEFI,但没有像 BIOS 或 EFI 这样普遍存在于 ARM 系统的接口。
Linux 启动界面是最常用的界面,参见内核源码和头文件中的 Documentation/arm/Booting。
如果你想编写一个可以跨不同 Arm 设备移植的程序,你必须自己检测内存。我不是很好,尤其是在 ARM 中,但有一些共同的原则——你可以简单地扫描整个地址空间并通过写入一个数字然后读回它来探测内存。通常,两个这样的操作提供了不同的数字,以排除偶尔的错误:
1. write 0aah
2. read and check for 0aah
3. write 055h
4. read and check for 055h
注意 1:为了更快的速度,不必检查每个字节 - 必须使用一些自然粒度并且仅在页面开始时检查(无论此平台上的大小如何)。
最后,您将获得 RAM 内存的映射。ROM内存不是那么容易被检测到的,但也没有通用的解决方案。
注意2:根据架构(好吧,我说我不是ARM专家),您的程序必须根据CPU的内存保护机制(如果有的话)访问整个内存。
注意 3:这种方法唯一可能出现的问题是内存映射 IO。触摸它会以不可预知的方式影响 IO 设备。这就是为什么,您必须知道寻址空间的哪个区域用于内存映射 IO,而根本不对其进行测试。