2009-08-13 01:16我發表於百度空間,今天轉過來,呵呵
linux核心原始碼學習(3)關於一些資料結構和一個理解 錯誤
---flyli
現來說說那個理解錯誤吧,前面看到PGD和PTE在記憶體映射的過程中,分別佔用的是10位的大小,然後組成一個20位的基址,加上一個12位的位移量就可以找到4G記憶體內的任意一處。
然而,今天看到所《linux核心原始碼情景分析》的第41頁的時候,發現表項是如此定義的
==================== include/asm-i386/page.h 36 50 ====================
36 /*
37 * These are used to make use of C type-checking..
38 */
39 #if CONFIG_X86_PAE
40 typedef struct { unsigned long pte_low, pte_high; } pte_t;
41 typedef struct { unsigned long long pmd; } pmd_t;
42 typedef struct { unsigned long long pgd; } pgd_t;
43 #define pte_val(x) ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
44 #else
45 typedef struct { unsigned long pte_low; } pte_t;
46 typedef struct { unsigned long pmd; } pmd_t;
47 typedef struct { unsigned long pgd; } pgd_t;
48 #define pte_val(x) ((x).pte_low)
49 #endif
50 #define PTE_MASK PAGE_MASK
===========================
這我一下就不明白了,以pmd和pte本來分別之佔用10位的空間,為什麼在定義他們的時候採用的最少也是32位的資料結構呢?為什麼不用16位的呢?用於引索的華我覺得16位的下標完全夠了
於是我上網開始查閱,發現網上沒人關心這個問題,怎麼可能呢?裡來以節省資源著稱的linux會開這麼打的空間難道是為了方便?或者是為了一致性?不現實吧
在網上沒找到答案,我開始翻閱自己的小書庫,在《自己動手寫作業系統》(這個是我買的正版書哦,當然網上也有pdf的,希望大家購買正版哈,寫的還是不錯的),關於pde和pte的一張中發現一個問題。
原來定義這些資料結構並不是進行軟體管理的,這是CPU建立記憶體映射的基本步驟,要不為什麼需要再定義PMD這個雞肋呢?
其實pgd,pte,還有pmd這些表項本來都只是在mmu建立記憶體映射的時候必須要有的,而且他可不是在軟體使用的時候用來控制的(假如只是軟體使用的華,這些值定義成引索下標的話,不但速度快還節省空間的阿),而是定義成了指標,一個32位的指標假如採用36位地址的話,就直接使用64位來定義了。。。
終於高明白了!!!!!!!!!!!1
罪過啊,罪過,今天看了好久竟然只是搞清這麼點問題,才理解了樹上2頁的內容。
不過只要人每天都在進步就是好的了,不過每天進步無論多少都是好的嗎?那是相對不進步而言的,
“當今社會是逆水行舟不進則退啊,起使進慢了也是退,因為別人都走到你前面了,你相對不就退步了嗎?”
另外今天還瞭解了一個全域量mem-map,是一個指向page結構的數組的指標,因此這個全域量的前20位有著相當作用的意義,對於軟體,作為下標就可以找到相應物理也面的page結構,作為硬體mmu來說,就是一個物理頁面的起使地址啊(後12位補0)