作者 主題: 2.6內核非連續記憶體的處理  (閱讀 3187 次)

0 會員 與 1 訪客 正在閱讀本文。

henrylab

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
2.6內核非連續記憶體的處理
« 於: 2009-02-22 04:13 »
碰到一個問題想請教大家,在 linux 2.6上,
我ARM9的板子上的DDR-SDRAM記憶體有四個BANK共256MB,解碼如下所示:
DDR2-SDRAM Memory 1   0x3C00_0000   0x3FFF_FFFF – 64MB
DDR2-SDRAM Memory 2   0x3400_0000   0x37FF_FFFF – 64MB
DDR2-SDRAM Memory 3   0xC000_0000   0xC3FF_FFFF – 64MB
DDR2-SDRAM Memory 4   0xC400_0000   0xC7FF_FFFF – 64MB
在linux連續記憶體(flat memory)下,可以選擇bank1~4任一個給OS用,但是會限制在64MB,現在想要全部給OS使用,其中,扣掉被其他硬體已經用作buffer的部分外,剩下…
DDR2-SDRAM Memory 1   0x3E20_0000   0x3FFF_FFFF – 30MB
DDR2-SDRAM Memory 2   0x35A0_0000   0x37FF_FFFF – 38MB
DDR2-SDRAM Memory 3   0xC200_0000   0xC3FF_FFFF – 32MB
DDR2-SDRAM Memory 4   0xC400_0000   0xC5FF_FFFF – 32MB
且因為硬體的限制,第四個BANK必須做為OS開始的記憶體,即組合成4->3->1->2,這樣可以成功的話,我將有132MB記憶體可以給Linux kernel使用,我查看KERNEL上的 ~kernel_home/include/asm-arm/memory.h有DISCONTIGMEM的方式處理非連續的記憶體,但是我查看其他的範例,雖然解碼不同,但是基本上是連續處理的,例如 kernel_home\include\asm-arm\arch-aaec2000 所示:
#ifdef CONFIG_DISCONTIGMEM
/*
 * The nodes are the followings:
 *
 *   node 0: 0xf000.0000 - 0xf3ff.ffff
 *   node 1: 0xf400.0000 - 0xf7ff.ffff
 *   node 2: 0xf800.0000 - 0xfbff.ffff
 *   node 3: 0xfc00.0000 - 0xffff.ffff
 */
跟我的情況實在差很多,不知從何下手,
請問各位先進,在linux kernel上我該如何處理這種不連續需要重組的實體記憶體(physical memory)可以給Linux系統或AP使用,謝謝!!