8

如何保留 SDRAM 的一部分,比如 4 个字节,在 U-Boot 和 Linux 内核之间传递一个标志,以便链接器不会初始化这个保留的内存位置,并且在热启动后保留该值?我试图避免使用引导参数来最大限度地减少嵌入式应用程序中使用的 NAND 闪存的磨损。我的问题可以被认为是对以下解决方案的扩展: 如何在 ARM 处理器上检测冷启动与热启动?

我已经使用下面的链接器脚本构建了 u-boot.lds 并使用:-fno-zero-initialized-in-bss 构建它但没有成功。

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
 . = 0x00000000;
 . = ALIGN(4);
 .text :
 {
  cpu/arm926ejs/start.o (.text)
  *(.text)
 }
 . = ALIGN(4);
 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
 . = ALIGN(4);
 .data : { *(.data) }
 . = ALIGN(4);
 .got : { *(.got) }
 . = .;
 __u_boot_cmd_start = .;
 .u_boot_cmd : { *(.u_boot_cmd) }
 __u_boot_cmd_end = .;
 . = ALIGN(4);
 __bss_start = .;
 _U_BOOT_FLAG = .;  . = . + 4;
 .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
 _end = .;
}

有任何想法吗?

4

2 回答 2

3

已经有一种方法可以在 U-Boot 和 Linux ARM 内核之间传递数据。它被称为ATAG内存列表。可用内存区域和板卡信息等信息使用此数据列表从 U-Boot 传递到 Linux ARM 内核。您可以为您的数据定义一个自定义 ATAG。在 U-Boot 中,添加您的例程以在lib_arm/armlinux.c. 然后ATAG在 中处理arch/arm/kernel/setup.c

有关文档,请参阅此替代站点的第 8 节。

ADDENDUM
引用的 ATAG 文档的链接很薄弱(即使 Google 也有一个错误的链接)。
尝试搜索文档的实际名称,即 Vincent Sanders 的“Booting ARM Linux”。
目前,在谷歌的 simtec 网站缓存中有一份副本,更广泛的搜索发现了韩语(?)的翻译。

Russel King 关于 ARM 启动的另一个或更早版本 (?)(但似乎已更新)是here

于 2012-08-27T20:38:16.167 回答
0

如果您想在如何检测 ARM 处理器上的冷启动与热启动中采用全局变量方法?

您可以强制该全局变量位于特定的 ELF 部分(请参阅http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Variable-Attributes.html),然后在链接器脚本中将该部分设置为一个特定的地址。

如果你有很好的 ld-script 技能,你甚至可以让链接器初始化除那个以外的所有 bss 部分:)

于 2012-04-29T12:47:56.707 回答