如何保留SDRAM的一部分,比如4个字节,在U-Boot和Linux内核之间传递一个标志,以便链接器不会初始化这个保留的内存位置,并在热启动后保留该值?我试图避免使用bootargs来最小化嵌入式应用中使用的NAND闪存的磨损。我的问题可以被视为对提供的解决方案的扩展: How to detect cold boot versus warm boot on an ARM processor?
我使用下面的链接描述文件构建了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 = .;
}
有什么想法吗?
答案 0 :(得分:3)
已经有一种在U-Boot和Linux ARM内核之间传递数据的方法。它被称为 ATAG 内存列表。使用此数据列表将可用内存区域和板信息等信息从U-Boot传递到Linux ARM内核。您可以为数据定义自定义ATAG。在U-Boot中,添加例程以在lib_arm/armlinux.c
中构建ARM标记。然后在arch/arm/kernel/setup.c
处理 ATAGs 。
有关文档,请参阅this或this alt site的第8部分。
<强>附录强>
引用ATAG文档的链接很脆弱(即使谷歌链接不好)
尝试搜索文档的实际名称,即Vincent Sanders的“Booting ARM Linux”
目前在Google的simtec网站缓存中有一个副本,更广泛的搜索出现了translation in Korean(?)。
Russel King在ARM启动时的另一个或更早版本(?)(但似乎已经更新)是here。
答案 1 :(得分:0)
如果您想在How to detect cold boot versus warm boot on an ARM processor?中使用全局变量方法:
您可以强制该全局变量位于特定的ELF部分(请参阅http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Variable-Attributes.html),然后在链接描述文件中将该部分设置为特定地址。
如果你有很好的ld-script技能,你甚至可以让链接器初始化除了那个之外的所有bss部分:)