2012-09-04 21 views
3

With CONFIG_FSL_BOOKE(P1020 RDB)2.6.31我需要在一些固定的位置(無所謂)在哪裏保留1MB的RAM,這意味着它不會被U-Boot或bootmem分配器,以便RAM內容在溫暖的重新啓動後存活。與警告我不能更改U-boot使用CONFIG_PRAM/mem=Linux PowerPC Book E通過熱重啓來保留原始RAM

編譯可重定位內核不是arc/powerpc 2.6.31中的一個選項。在arch/powerpc/kernel/setup_32.c中不支持memmap

理想情況下,這個區域應該保留,而不是L1 d-cached,以便它可以用來存儲從中斷上下文的ramoops。

有沒有辦法在bootmem之前將_end移出0x600000來創建一個任何人都不會觸及的洞?也就是說,讓內核認爲_end更遠?

在vmlinux.lds.S我想是這樣的:

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

改爲

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

然而,__bss_stop和爲0x400000之間的地區已被覆蓋。

回答

1

最好的解決方案是將內存區域添加爲設備樹中的保留區域。

這樣它將在啓動過程中提前保留,不應該被內核觸及。

+0

顯然你的意思是使用kernel arch/powerpc/boot/dts/ .dts中的「memory」標記在RAM中定義一個洞。這是「正確」的答案,因爲它不涉及內核源代碼。然而,大多數飛思卡爾SoC板(包括我的)都忽略了這一點,並在u-boot ddr.c中配置了RAM。我需要的是一個政治上不正確的內核破解,可能會導致_end,RAM磁盤啓動或板信息結構的大小。看起來僞造板子信息結構的大小是最好的。 –

+0

我不太瞭解u-boot,所以你可能是對的,雖然我不知道如果內存儲備被忽略,它是如何工作的。 另一種選擇是在早期啓動代碼中的某處顯式調用memblock_reserve()(可能是2.6.31中的lmb_reserve())。 – mpe

+0

「正確的」答案是per @ mpe:在2.6.31中:在調用phyp_dump_reserve_mem之後,arch/powerpc/kernel/prom.c將另一個調用添加到lmb_reserve。確保您的引導加載程序未配置爲執行memtest,以便在啓動引導序列之前刪除您保留的區域。 –