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

2007年12月9日 星期日

Linux Memory Paging - 1

Linux 的記憶體 Paging 機制與處理器平台有關
事實上,大部份的分頁處理動作是靠硬體來執行的
以 x86為例,定址到 32bits的記憶體(即4GB),有以下幾種機制:

80x86 paging with PAE disabled
2-level paging, 4KB/page, 32-bit linear address to 32-bit physical address
80x86 paging with PAE disabled
1-level paging, 4MB/page, 32-bit linear address to 32-bit physical address

若啟用 PAE(Physical Address Extension) 功能,則可使用 36bits的記憶體空間(即64GB):

80x86 paging with PAE enabled
3-level paging, 4KB/page, 32-bit linear address to 36-bit physical address

80x86 paging with PAE enabled
2-level paging, 2MB/page, 32-bit linear address to 36-bit physical address


Linux 在 2.6.11 之後的核心使用 4-level 的 Paging
此記憶體分頁的模型可以套用在各種處理器上,四層分別為:
• Page Global Directory
• Page Upper Directory
• Page Middle Directory
• Page Table
當記憶體定址空間是 32bits 時,不使用 PUD 及 PMD
如此,便可同時支援 32 及 64 位元的記憶體架構

2.6 Linux paging model
4-level paging, 32/64-bit linear address to 32/64-bit physical address

2.6 Linux paging with PAE disabled
2-level paging, 4KB/page, 32-bit linear address to 32-bit physical address
2.6 Linux paging with PAE enabled
3-level paging, 4KB/page, 32-bit linear address to 36-bit physical address
2.6 Linux paging with PAE enabled
2-level paging, 2MB/page, 32-bit linear address to 36-bit physical address

在 Kernel Source Code 中,Page-Directory 及 Page-Table 是用相同的結構
分別名命為 pgd_tpte_t,定義於 include/asm-i386/page.h
若未使用 PAE,則其大小為 32bits,否則為 64bits

Page-Directory Entry with PAE disabled
4KB/page-table, 32-bit physical address

32bits 的 pgd_t 的欄位格式如下:

//2.6 Linux : Page Global Directory
typedef struct { unsigned long pgd; } pgd_t;
Page-Table Entry with PAE disabled
4KB/page, 32-bit physical address

32bits 的 pte_t 的欄位格式如下:

//2.6 Linux : Page Table Entry
typedef struct { unsigned long pte_low; } pte_t;
Page-Directory Entry with PAE enabled
2MB/page, 32-bit physical address

此時的型態為 64bits 的資料,定義如下:

//2.6 Linux : Page Table Entry
typedef struct { unsigned long pte_low, pte_high; } pte_t;

//2.6 Linux : Page Middle Directory
typedef struct { unsigned long pmd; } pmd_t;

//2.6 Linux : Page Global Directory
typedef struct { unsigned long pgd; } pgd_t;


結論:
Linux 使用 4-level paging 機制來套用到不同的硬體平台,而且可相容於 32/64-bit 的架構
但是,若硬體的 Paging Unit 其分頁方式大於 4-level,Linux 就無法支援

2007年12月8日 星期六

武陵農場 楓葉紅了

11/24-26 去梨山三日遊,挑這個時間去, 當然就是要看楓葉啦




進台7甲後,直奔福壽山農場,這裏以松廬配紅楓而聞名
可惜楓葉沒有全紅,但也夠美的了

農場裏有還個 蘋果王,用接枝的方式讓一顆樹生出許多不同品種的蘋果

玩到太陽下山,臨走前跟水果販買了一箱雪梨
老闆說是最後的雪梨了,不想留,全部14顆賣1000元聽說這個價錢超便宜的 ?

然後就到第一天住的民宿 http://www.ssy.idv.tw/
雖然空間小了點,但民宿老闆很熱情,地點就在武陵農場入口旁邊

第二天進武陵農場,今晚就住這了
首先走桃山瀑布,這個步道是一路上坡,來回要3小時
上午去比較好,因為陽光的照射,瀑布會有彩虹


接著到雪山登山口走走、在農場到處逛逛、喝下午茶
這裏的楓葉也紅了大半,晚上還有免費的音樂會--吉他表演

其實武陵農場四季都有看頭,真是個渡假的好地方
在熱門時段想要住在農場裏,記得要提早訂房

第三天就走台14甲,從埔里下山
全部的照片在此 http://picasaweb.google.com/yichung.shen/20071124