我正在 ARM 上开发一个基本的管理程序(使用板 Arndale Exynos 5250)。我想以访客身份加载 Linux(ubuntu 或其他)/Android。目前我正在使用 Linaro 发行版。
我快到了,除了最后一个:为我的管理程序保留内存,以便内核在解析 FDT 或内核命令行之前不会尝试覆盖它,大多数大问题都已经解决了。
问题是我的 Linaro 发行版的 U-Boot将 R2 中的 FDT 传递给 linux 内核,但是内核试图在看到我在 FDT 中保留该内存区域之前覆盖我的管理程序的内存(通过反编译 DTB,修改 DTS 和重新编译它)。我尝试更改内核命令行参数,但在内核尝试覆盖我保留的内存部分之后,它们也会被解析。
因此,我需要的是物理 RAM 中的一个安全内存位置,以便将我的管理程序的代码放在其中,以便 Linux 内核在解析 FDT 或其内核命令行之前不会尝试访问(r/w)它。
上下文细节:
- Exynos 5250 上的系统 RAM 布局为:物理 RAM 从0x4000_0000 (=1GB)开始,长度为0x8000_0000 (=2GB)。
- linux内核在0x4000_7000加载(通过U-Boot) ,它的大小(未压缩的uImage)小于5MB,它的入口点设置为0x4000_8000;
- uInitrd在0x4200_0000加载,大小小于2MB
- FDT ( board.dtb ) 在0x41f0_0000加载(在 R2 中传递)并且大小小于35KB
- 我目前在0x40C0_0000加载我的虚拟机管理程序,我想从该地址开始保留 200MB ( 0x0C80_0000 ),但内核在查看 FDT 或命令行之前尝试在那里写入(第 2 阶段 HYP 陷阱告诉我)该区域实际上是保留的。相反,如果我在0x5000_0000加载我的管理程序(甚至不修改原始 DTB 或命令行),它不会尝试覆盖我!
- FDT 是直接传递的,而不是通过ATAGs
因为当在0x5000_0000加载我的管理程序时,内核不会尝试覆盖它,我假设在解析 FDT/命令行之前 Linux 不会触及内存区域。我需要知道这是否属实,如果属实,关于这些内存区域的一些细节。
谢谢!
相关问题:
有谁碰巧知道以下之间的优先级是什么:ATAGs / kernel-command line / FDT?例如,如果我通过内核命令行保留内存,但不在 FDT (.dtb) 中,它应该工作还是命令行被 FDT覆盖?这三者之间是否存在某种连接?