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

标签 memory linux-kernel arm embedded-linux u-boot

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

有什么想法吗?

最佳答案

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

有关文档,请参阅 this 的第 8 节或 this alt site .

附录
指向引用的 ATAG 文档的链接很薄弱(即使 Google 也有错误的链接)。
尝试搜索文档的实际名称,即 Vincent Sanders 的“Booting ARM Linux”。
目前,在 Google 的 simtec 网站缓存中有一份副本,更广泛的搜索出现了 translation in Korean。 (?)。

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

关于memory - 保留 SDRAM 的一部分在 U-Boot 和 Linux 内核之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341378/

相关文章:

linux - 构建linux内核中syscall_32.tbl、syscall_64.tbl文件的参数

c - ARM:是从 int 原子写/读吗?

arm - 实时操作系统中的实时操作系统

c++ - 为什么使用最大位域序列定义 C++ 内存?

c - 使用 gdb 64bit 越界检查内存

Linux - 识别在物理内存中拥有特定地址的进程

linux - 从/proc/kcore获取系统调用表中的系统调用地址

ios - 在 ARM/Thumb (IOS) 上解码 BLX 指令

Java:在内存中存储大数据(> 2GB)的官方方法是什么?

memory - 允许的内存大小为 16777216 字节耗尽(试图分配 78 字节)