2009-08-11 01:47於百度空間部落格發表,今天移過來
linux核心原始碼學習(1)記憶體映射模式 flyli 現在開始好好學習linux核心了,我覺得學習核心最好的方法莫過於是閱讀原始碼了,最近我就一直在讀,不過說實話,因為本人不是電腦專業學生(我 是電子資訊工程專業的)所以讀原代碼的難度還是有一些的,不過呢,我覺得功夫不負有心人,我啃也好啃完《linux核心原始碼情景分析》這本書~ 剛開始讀核心確實不知道從何讀起,藉助一本好的書我覺得還是很有必要的,在這裡我買的是《linux核心原始碼情景分析》,這本書,我覺得寫的非常好,希望大家也買本來看看哈,網上也有pdf版本的,不過我還是覺得買本書比較好,而且要買正版的,畢竟人家高手寫這麼好的一本書給我們也不容易,增加點收入也是應該的嘛,嘎嘎。 好了,現在開始說正題,這本書其實我以前也大概翻過一點,想的“好讀書不求甚解”,但是發現假如不完全讀懂的話,讀著獨著後面就讀不動了,於是開始重頭認真看氣。 今天下班終於把這本書關於記憶體映射這一部分完全讀懂了讀到了39頁,不容易啊。。。。假如有兄弟在讀這本書的話歡迎留言探討哈~~~ 當然我不想抄書到部落格上來,但是我想把書上的東西連貫起來,這樣比較容易懂。
以上是pentium pro之後的cpu的三層記憶體映射,但是其中的PMD和PI層其實只有一層,linux中定義的是把PMD這一層給刪掉了,為什麼呢?因為在pgtable.h這個標頭檔中定義pmd這個表現只有一個,那麼就相當於沒有什麼選擇的餘地了,也就是為了糊弄一下CPU的模式了,但是為什麼不按照CPU硬體所支援的3層映射呢?原因就是雖然我們的程式有3G的虛擬空間,但是你見過多少程式佔用的記憶體超過1G啊?何況是3G。。。這樣就勢必產生大量的空表項浪費記憶體空間,於是linux便去掉了中介層,通過兩層映射,節約空間。虛地址和線性映射地址其實是一致的都是從0開始的4G訪問空間,但是對於系統來說,因為linux核心佔用的虛擬記憶體空間其實是1G(不是真的佔用,而是在虛擬位址中佔用的哈),所以當虛地址轉向物理地址是需要減去1G,反之則加上 其中段地址為20位,而頁面表的大小是4k,所以我們可以算出CPU可以訪問4G的線性空間 而每個目錄項(GDT)佔用的是32位的空間,而其PGD,PMD每個佔用了10位的空間,那麼只用到了20位,於是剩下的12位就用來挪作他用,用來什麼標誌位啊,還有一些其保護和校正作用的了 但是線性表(LDT)和目錄項的關係還沒有研究透,明天繼續哈 今天就寫這麼多了,太晚了要不明天起不來上班了,明天繼續看書,繼續寫哈 假如我的文章中有什麼錯誤,希望大蝦指正哈,小弟感激不盡! |