<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        虛擬存儲器

        作者:公平   來源:本站原創   點擊數:  更新時間:2014年03月14日   【字體:

        虛擬存儲器是操作系統中的重要內容,也是理解的難點和重點,雖然程序員不用直接和虛擬存儲器打交道,但是理解虛擬存儲器能夠更好的理解操作系統的存儲器管理。
        虛擬存儲器實質就是硬盤中的一部分存儲器,可以將其作為緩存。

        虛擬存儲器的最大好處是實現在小內存系統(較小的物理內存)的應用。比如一個linux進程的虛擬存儲器大小是4G,其中前3G作為用戶空間,后1G作為內存的空間。但是實際的物理內存是一個2G甚至更小的物理內存時如何處理呢??這時虛擬存儲器的概念就體現其巨大的優勢。

        虛擬地址和物理地址之間又是如何的轉換呢?這些都是需要了解的。虛擬地址是由CPU產生,然后虛擬內存需要通過MMU轉換為物理內存。

        虛擬存儲器和物理存儲器的關系:

        虛擬存儲器文件系統將物理存儲器和虛擬存儲器分成等大小的頁面,比如4K一頁,這樣物理存儲器和虛擬存儲器分解成頁數量不同的存儲器頁。通過一種叫做頁表(PTE)的結構體實現虛擬頁到物理頁的聯系。具體的聯系就是:
        頁表常住在內存中,頁表的大小一般等于虛擬存儲器的頁數。每一個頁表由一個有效位和一個地址位構成。當有效位是1事,說明虛擬頁中的數據緩存到物理內存中的起始地址,而如果有效位為0,后面的地址位為null,則說明該虛擬頁還沒有分配。如果地址位不為null,則指出了該頁表中在虛擬存儲器的起始地址,但是還沒有緩存到物理內存中。這樣就通過了頁表實現了虛擬頁和物理頁之間的聯系。因此理解頁表是很重要的。多級頁表結構以及STB等技術都是為了減少常駐空間或者提速。

        虛擬地址由VPN和VPO構成,而物理地址由PPN和PPO,其中PPO=VPO,其中VPN是指虛擬存儲器中的頁號,而PPN是物理存儲器的頁號,這個頁號的轉換關系與頁表有關。VPO和PPO都是在該也中的偏移量。通過頁表和偏移量就能實現具體位置的訪問。
        具體的加載方法就是將某個虛擬存儲頁得數據緩存到任意的物理存儲頁,這樣就實現了在虛擬存儲器中連續頁,映射到物理內存中并不一定是連續。這樣也減小了對連續內存的要求。通過一個頁表的引入就能實現虛擬頁到物理頁得映射關系。

        在linux中內核為每個進程分配一個單獨的頁表。這樣每個進程都有了相同大小的虛擬存儲空間(4G)。每個虛擬存儲的空間分配也是相同的,每個段區的起始地址也是相同的,這樣就簡化了共享、加載、鏈接等過程。
        linux采用mmap實現文件到進程虛擬存儲器的加載過程,加載兩種類型的文件(對象):普通文件、匿名文件(二進制)。

        同時對象的形式也是多樣的,主要是理解共享對象和私有對象,私有對象又主要理解私有寫時頁保護。
        共享對象是指將一個共享對象映射到各個進程的共享段中,然后通過頁表將各個進程的共享段加載到統一的物理存儲器中,這樣各個進程都能實現對共享,且在物理存儲器中只有一個對象的拷貝。各個進程對共享對象的寫操作都會反應到其他的進程中以及磁盤文件中。

        多個進程對一個似有對象的映射比較有意思。私有對象的開始生命周期的方式與共享對象相似,即在物理存儲器中只有一個私有對象的拷貝,但是設置訪問的權限為可讀。如果只是讀過程,所有進程對似有對象的訪問與共享對象沒有差別,但是如果是某一個進程試圖對私有對象進行寫操作就會引發保護故障,然后在故障處理程序中將(內存中)被寫的頁面內容也拷貝到一個新的存儲頁面中,并設置好PTE,將新創建的頁面設置為可寫。然后對新創建的頁面進行寫操作,這樣的操作就不會導致對私有對象的寫操作反應到磁盤文件中。這種技術稱之為“寫時頁拷貝”。

        fork函數的理解主要就是弄清楚兩種方式的差別。fork中創建了一個子進程,其中子進程和父進程的內容相同,因此開始是兩個進程共享一個空間,但是兩個進程分別會試圖寫一些段(data、bss等),這時發生了“寫時頁拷貝”,將需要寫的頁內容拷貝到另一個新創建的頁中,此時再次發生寫操作,這也就是為什么打開的一些文本描述符在子進程也能找到,就是因為兩個進程對一個私有對象沒有進行寫操作時是對一個物理存儲器的一份拷貝,當某一個進程寫操作時,這時發生了寫時頁拷貝,再次對新的頁進行操作即可完成且不會影響別的進程。但是本來的共享區仍然滿足共享的特征。但是.text等段不會發生寫時頁拷貝,因此父子進程還是共享代碼段。這就是為什么fork函數后兩個進程是共享代碼段的原因(發生了私有對象的寫時頁拷貝)。

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮