【问题标题】:Reserving a portion of SDRAM to pass data between U-Boot and the Linux Kernel保留 SDRAM 的一部分在 U-Boot 和 Linux 内核之间传递数据
【发布时间】:2017-04-08 08:30:10
【问题描述】:

如何保留 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 = .;
}

有什么想法吗?

【问题讨论】:

  • 你用的是什么板子?多功能板还是定制板?你在说什么 SRAM?
  • 板子是at91sam9g45,实际上是DDR2-SDRAM。
  • 为知道如何正确拼写 U-Boot 点赞。
  • 你已经有一块 ram 用于放置 linux 内核,可选择放置根文件系统,在该空间内你还放置 ATAG 和/或设备树,然后传递该地址进入内核。不知道你为什么要“分配”那个空间,你是一个引导加载程序,你拥有所有的芯片资源,包括内存。您不用于引导加载程序的是上述项目的所有可用空间。此外,您还可以根据需要使用更多空间来传递您认为需要的任何其他东西。

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


【解决方案1】:

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

有关文档,请参阅 thisthis alt site 的第 8 节。

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

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

【讨论】:

  • @kakeh - 似乎没有网站托管该文档了。见附录。
【解决方案2】:

如果您想采用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 部分 :)

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2019-05-14
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2015-04-28
    相关资源
    最近更新 更多