0

PC 架构上(BIOS 的存在和使用非常标准化),您可以通过使用INT15 BIOS 中断函数来发现 RAM 内存的大小,以及它的保留/免费使用区域,函数0xE820

由于我对低级编程充满热情,并且在对英特尔架构进行了大约 6 个月的编程后,我决定尝试了解其他架构的工作原理。所以我开始深入研究 ARM 开发。我目前正在开发 2 块板:Olimex A20 OlinuXino-MICROSamsung Arndale 的 Exynos 5250。我要做的是将我为英特尔架构开发的管理程序移植到这两个板上。我现在正处于尝试以可靠可接受的标准化方式以编程方式检测系统的内存映射的阶段方式(我不希望为不同的 ARM 板编写完全不同的代码)。但到目前为止,我发现相关文档有点混乱。

在 Olimex A20 上,我有一个 Cortex-A7 ARM CPU。在此处找到的 PDF:http: //infocenter.arm.com/help/topic/com.arm.doc.den0001c/DEN0001C_principles_of_arm_memory_maps.pdf适用于 Cortex-A7 和其他 CPU,在第 14 页指出内存寻址空间从 1GB 到 2GB是为内存映射 I/O 设备保留的,而在此链接中找到的 Olimex-A20 文档https://github.com/OLIMEX/OLINUXINO/blob/master/HARDWARE/A20-PDFs/A20 %20User%20Manual%202013-03-22.pdf?raw=true第 21 页指出从 1GB 到 3GB 的内存寻址空间是DDR-II/DDR-III 内存

我只是感到困惑还是这两个文件之间存在不一致?

4

2 回答 2

1

ARM 芯片上的内存映射是高度特定于芯片的。通常也没有像 BIOS 这样的东西,因此您的引导加载程序或管理程序必须自己找出内存布局。

通常,您需要使用 SDRAM 控制器来查询和初始化已安装的 SDRAM 芯片。这是一个非常重要的过程,而且又一次是非常特定于芯片的过程。您应该检查您的芯片可用的引导加载程序(例如 U-Boot)的代码,并查找内存初始化代码。

但是,在许多情况下,内存“映射”(RAM 的开始及其大小)只是为引导加载程序移植到的每个板进行硬编码,因为它不太可能在每次引导时都更改。

于 2013-10-23T11:21:20.233 回答
0

过去,ARM 引导加载程序使用引导 ARM Linux中描述的 ATAG 结构将信息传递给 Linux 内核。引导加载程序至少需要初始化系统中的 RAM 并传递 ATAG_MEM 结构来描述 RAM 在地址空间中的位置。解释这些结构会给你一些你需要的信息,但它不会告诉你任何关于任何外围设备的信息。在此引导方法中,机器类型用于触发特定于平台的代码以初始化其余硬件。

这样做的新方法是通过Flattened Device Tree。设备树起源于 OpenFirmware,除了描述 RAM 映射外,还可以描述其余的硬件和外围设备。

于 2013-11-27T15:18:04.927 回答