保留一部分SDRAM用于在U-Boot和Linux内核之间传递数据

8
我该如何保留SDRAM的一部分,例如4个字节,以便在U-Boot和Linux内核之间传递标志,使得这个保留的内存位置不会被链接器初始化,并且在热启动后保留值?我试图避免使用bootargs来减少嵌入式应用中使用的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 = .;
}

有什么想法吗?


你使用的是什么板子?是万能板还是自定义板?你所说的 SRAM 是哪一种? - sessyargc.jp
该板子是at91sam9g45,实际上它是DDR2-SDRAM。 - user1357493
点赞只是因为知道如何正确拼写U-Boot。 - sawdust
你已经必须拥有一块用于放置Linux内核的RAM,可选择在其中放置根文件系统,在该空间中还要放置ATAG和/或设备树,然后将该地址传递给内核。不确定为什么您会“分配”该空间,您是引导加载程序,拥有所有芯片资源,包括RAM。您未用于引导加载程序的部分都是上述项目的所有自由空间。此外,根据需要,您可以使用更多的空间来传递任何其他感觉需要的内容。 - old_timer
2个回答

3
已经有一种方法可以在U-Boot和Linux ARM内核之间传递数据。它被称为ATAG内存列表。可用内存区域和板信息等信息是通过这个数据列表从U-Boot传递到Linux ARM内核的。您可以为自己的数据定义一个自定义ATAG。在U-Boot中,将您的例程添加到lib_arm/armlinux.c中以构建您的ARM标记。然后,在arch/arm/kernel/setup.c中处理ATAGs
有关文档,请参见此备用网站的第8节
补充说明
所引用的ATAG文档链接脆弱(甚至Google也有坏链接)。 尝试搜索实际名称为“Booting ARM Linux”的文档。
目前在Google缓存的simtec网站上有一份副本,广泛搜索还找到了韩文翻译(?)此处
Russel King关于ARM启动的另一个或早期版本(?)(但似乎已更新)在此处

@kakeh - 看起来没有任何网站再托管那个文档了。请查看附录。 - sawdust

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接