星期一, 8月 20, 2007

Virtual address和virtual memory

學os這門學問真的要從最底層開始了解起,包括硬體和軟體。以前看恐龍本在看到memory management跟virtual memory這兩章之後,突然會覺得學了很多東西突然不踏實起來,而且有時候不僅是不踏實,甚至會覺得很混淆。
特別是cache、write buffer、TLB、mmu、physical memoyy、logical memory…等名詞突然放在一起的時候。所以以前大學的時候碰到考試就是把圖背起來,然後把一些經典考題練習的滾瓜爛熟,去考試都還算ok。
直到開始工作後,玩了一些架構(mips跟arm)後,這些觀念才比較清楚。
簡言之,最單純的系統就是cpu只看的到physical address的系統,缺點就是每一個process在memory的address都要算的很精準,彼此不會overlap,不然系統可能會crash。為了避免這種缺點,有人認為可以在physical address之外另外建立一個虛擬的address,然後程式在cpu執行的時候只認這個address,可以把這個address叫作logical address或是virtual address。這樣一來,就需要有一個角色來轉換這兩種address,把virtual address轉換成physical address或是把physical address轉換成virtual address。這個角色通常是一個硬體(我還沒看過軟體的)的relocation register。這樣一來,我們還是可以像之前所提的那個最單純的系統一樣,在physical address放了不同process彼此不會互相影響,但是cpu在執行這三個process時,他們可能都有相同的virtual address(但是每個process都有不同的physical address,比如說是:0x604000、0x804000、0xA04000),比如說是0x004000。這一來就會有一個好處,在執行一個process時,cpu跟本就不知道其他process是在physical address space的哪個位置。這樣對其他未被執行,但存在在physical memory裡面的process反而是一種保護。因為你不去查relocation register的值,跟本就不知道其他process實際的physical address是什麼。
這就是virtual address的由來,因為多了一個virtual address space對process的管理有一些額外的好處。
至於virtual memory,則是一種技術,讓你的process可以超過你所擁有的的實際記憶體大小。

沒有留言: