一段下班班車上的思緒

今天下班在從東莞回深圳的班車上突然想到Linux系統中或者生活中到處充滿着虛擬化。


先引用幾段我比較喜歡的理論:


曾有一段時間程序員擔心是否有可用的內存來存放自己的程序指令和數據,於是出現了虛擬內存,後來,爲了更好地時分共享昂貴的大型機系統,出現了虛擬服務器。


虛擬化技術的實現形式是在系統中加入一個虛擬化層,虛擬化層將下層的資源抽象成另一種形式的資源,提供給上層使用。


通過空間上的分割,時間上的分時以及模擬,虛擬化將一份資源抽象成多份,反過來,虛擬化也可以將多份資源抽象成一份。


總的來說,虛擬化可以把一個紛繁複雜、無計劃性的世界改造成一個似乎爲人們的特定需求而量身打造的時間。

           出自《系統虛擬化:原理與實現》


下面說說我對關於linux系統中的kvm,以及老生常談的虛擬化文件系統和mmap函數零拷貝的最簡單直接第一印象的理解。


對於虛擬化文件系統就是在mount時爲突破口,再根據不同的文件系統在struct super_block 、root inode上掛載不同的回調函數,有root然後有萬物,最後read write不同的文件系統上的文件時,自然有不同的操作。


對於mmap, 

 fd = open(...);

char *addr = void *mmap(void *addr, 

             size_t length,

             int prot, int flags,

            int fd, off_t offset);

memcpy(addr, "jeff" , 4);

memcpy(buff, addr, 4);


open不同的文件或者設備,返回不同文件或設備的句柄,然後mmap時,通過fd找到對應的文件或者設備,最後返回一個起始地址,當在用戶讀寫addr時,由於這個addr剛開始沒有對應的物理內存,此時會page fault, 如果fd對應的是普通文件,內核就就會去讀寫磁盤,如果是一個io設備,內核就會去讀寫io mem, 或者fd對應的是一個虛擬設備,內核就會給它分配一塊指定的內存空間去讀寫,所以不管這樣,當發生page fault的時候,此時內核想怎麼樣玩就怎麼玩,最後返回addr對應的page即可,page中包含任意指定的數據。


對於kvm虛擬化,當guest在訪問特權指令或者訪問io或者mmio時,被host截獲到,host瞞着guest做任意想做的事從而實現內存或者io虛擬化。


無處不虛擬,比如我上次在微信公衆號分享linux內核資料,告知回覆一個字符串osdoc就能獲取linux內核資料,當讀者回復osdoc時,我能在不同的時間在後臺改寫回復內容。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章