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

Memory 保留一部分SDRAM以在U-Boot和Linux内核之间传递数据,memory,linux-kernel,arm,embedded-linux,u-boot,Memory,Linux Kernel,Arm,Embedded Linux,U Boot,我如何保留一部分SDRAM(比如4字节),以便在U-Boot和Linux内核之间传递一个标志,从而使这个保留的内存位置不被链接器初始化,并且在热引导后保留值?我试图避免使用引导参数来最小化嵌入式应用程序中使用的NAND闪存的磨损。我的问题可以被视为是以下解决方案的延伸: 我使用下面的链接器脚本构建了u-boot.lds,并使用以下脚本构建了它: -fno零在bss中初始化,但未成功 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf

我如何保留一部分SDRAM(比如4字节),以便在U-Boot和Linux内核之间传递一个标志,从而使这个保留的内存位置不被链接器初始化,并且在热引导后保留值?我试图避免使用引导参数来最小化嵌入式应用程序中使用的NAND闪存的磨损。我的问题可以被视为是以下解决方案的延伸:

我使用下面的链接器脚本构建了u-boot.lds,并使用以下脚本构建了它: -fno零在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 = .;
}

有什么想法吗?

如果您想在以下方面采用全局变量方法:

您可以强制该全局变量位于特定的ELF部分(请参阅),然后在链接器脚本中将该部分设置为特定地址


如果你有很好的ld脚本技能,你甚至可以让链接器初始化所有bss部分,除了一个:)

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

有关文件,请参见或的第8节

附录
指向引用的ATAG文档的链接很脆弱(即使谷歌也有一个坏链接)。
尝试搜索文档的实际名称,即Vincent Sanders的“Booting ARM Linux”。
目前,在谷歌的simtec网站缓存中有一个副本,更广泛的搜索结果是(?)


拉塞尔·金关于手臂引导的另一个或更早的版本(?(但似乎已经更新)是

你用的是什么板?多功能板还是定制板?你在说什么SRAM?该板是一个at91sam9g45,实际上是DDR2-SDRAM.Upvote,只是为了知道如何正确拼写U-Boot。你已经有了一块ram,可以用来放置linux内核,也可以选择放置根文件系统,在该空间中,您还可以放置ATAG和/或设备树,然后将该地址传递给内核。不知道你为什么要“分配”这个空间,你是一个引导加载程序,你拥有包括ram在内的所有芯片资源。引导加载程序不使用的是上述项目的所有可用空间。另外,根据需要,您可以使用更多的空间来传递您认为需要传递的任何内容。@kakeh-似乎没有任何站点再承载该文档了。见增编。