Memory management Linux PowerPC Book E通过热重启保留原始RAM

Memory management Linux PowerPC Book E通过热重启保留原始RAM,memory-management,linux-kernel,powerpc,Memory Management,Linux Kernel,Powerpc,使用CONFIG_FSL_BOOKE(P1020 RDB)2.6.31,我需要在某个固定位置(无论在哪里)保留1MB的RAM,这意味着U-Boot或bootmem分配器不会触及它,以便RAM内容在热重启后仍然存在。需要注意的是,我不能将U-boot更改为使用CONFIG\U PRAM/mem= 编译可重定位内核不是arc/powerpc 2.6.31中的选项memmap 理想情况下,这个区域应该保留,而不是l1d缓存,以便可以使用它来存储中断上下文中的ramoop 是否有任何方法将\u end移

使用
CONFIG_FSL_BOOKE
(P1020 RDB)2.6.31,我需要在某个固定位置(无论在哪里)保留1MB的RAM,这意味着U-Boot或bootmem分配器不会触及它,以便RAM内容在热重启后仍然存在。需要注意的是,我不能将U-boot更改为使用
CONFIG\U PRAM
/
mem=

编译可重定位内核不是arc/powerpc 2.6.31中的选项memmap

理想情况下,这个区域应该保留,而不是l1d缓存,以便可以使用它来存储中断上下文中的ramoop

是否有任何方法将
\u end
移动到bootmem之前的0x600000,以创建一个任何人都不会触及的孔?也就是说,诱使内核认为
\u end
更远

在vmlinux.lds.S中,我尝试了以下方法:

    . = ALIGN(PAGE_SIZE);
    _end = . ;
    PROVIDE32 (end = .);
改为

    . = ALIGN(PAGE_SIZE);
    _start_unused_ram = .;
    . = ALIGN(0x400000);
    _end = . ;
    PROVIDE32 (end = .);

但是,覆盖了
\u bss\u stop
和0x400000之间的区域。

最佳解决方案是将内存区域作为保留区域添加到设备树中


这样,它将在引导早期保留,内核不应触及它。

显然,您的意思是使用内核arch/powerpc/boot/dts/.dts中的“memory”标记在RAM中定义一个洞。这是“正确”的答案,因为它不涉及内核源代码。然而,包括我在内的大多数飞思卡尔SoC板忽略了这一点,并在u-boot ddr.c中配置RAM。我需要的是一个政治上不正确的内核破解,以伪造U端、RAM磁盘开始或电路板信息结构的大小。看起来假装board info结构的大小是最好的。我对u-boot不太了解,所以你可能是对的,不过我想知道如果忽略内存保留,一般情况下这是如何工作的。另一个选项是在早期引导代码中的某个地方显式调用
memblock_reserve()
(可能是2.6.31中的
lmb_reserve()
)。正确的答案是按照@mpe:in 2.6.31:arch/powerpc/kernel/prom.c在调用phyp_dump_reserve_mem之后再添加一个对lmb_reserve的调用。确保引导加载程序未配置为执行memtest,该memtest会在启动引导序列之前擦除保留的区域。