2007年12月29日 星期六

Linux Memory Paging - 2

Linux的每一個Process都有4GB的記憶體定址空間,並且被劃分成:
• 3GB的 User Space (0x00000000 - 0xBFFFFFFF)
• 1GB的 Kernel Space (0xC0000000 - 0xFFFFFFFF)

其中,位址0xC0000000以下是各個Process自已獨有的空間
位址0xC0000000以上給Kernel使用的空間則是由所有Process共享
而Kernel Space是直接映射到實體記憶體上,如下圖所示:


故0xC0000000就成為Linux切割記憶體的方式(此例為一比三)
該值被定義成 PAGE_OFFSET,當然這個值是可以調整的

Linux開機時,其Kernel Code會載入實體記憶體位址0x00100000處
即第二個 1MB 的位置,接著是存放Kernel Data的空間
這些被Kernel使用的範圍會標記成 _text_end

在Kernel中,要將Virtual Address轉換成Physical Address時
使用巨集 __pa(x),其實就是將x減掉PAGE_OFFSET
反之,則使用巨集 __va(x),即將x加上PAGE_OFFSET

沒有留言: