0

我正在 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
  • uInitrd0x4200_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覆盖?这三者之间是否存在某种连接

4

2 回答 2

0

kernel/FDT/bootloader 命令行的优先级取决于内核配置 - 执行 menuconfig 并在“Boot options”下检查。您可以将 ATAGS 与内置命令行结合使用,但不能将 FDT - 毕竟,FDTchosen节点应该由引导加载程序生成 - U-boot 的 FDT 支持是可以的,所以你应该让它这样做而不是将其烘焙到如果您想要 FDT 命令行,请使用 .dts。

内核在获得内存映射之前非常保守,因为它必须盲目地相信引导加载程序已经按照指定的方式布局。另一方面,U-boot 会在整个地方复制自身的部分,并且肯定是 RAM 高端的罪魁祸首 - 如果你#define DEBUG在(我认为)common/board_f.c你会得到它在重定位期间命中的转储(不包括Exynos iRAM SPL/引导代码的东西,但无论如何这不会有什么不同)。

于 2014-01-24T01:11:01.473 回答
0

根据 https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/arm/Booting,安全位置从 RAM开始128MB 开始(假设内核加载在那个地区,应该是)。如果 zImage 在内存中加载的位置低于解压缩图像的结束地址,它可能会在开始解压缩之前将自身重新定位到更高的位置。但除此之外,内核在内存中的解压缩图像末尾之外还有一个 .bss 区域。

(还请注意,您的 FDT 和 initrd 位置已经违反了此规范,并且您要保留的内存块涵盖了这两个位置。)

实际上,您的保留区域应该在内存中的 FDT 和 initrd 之后 - 0x50000000 是。但是从 RAM 开始 > 0x08000000 的任何东西都应该可以移植,只要它不会覆盖内存中的 FDT、initrd 或 U-Boot。

于 2014-01-21T05:52:55.273 回答