接到進程虛擬地址空間的過程稱為內存映射。
圖3.5虛擬內存區域
每個進程的虛擬內存用一個mm_struct來表示。它包含當前執行的映象(如BASH)以及指向vm_area_struct的大量指針。每個vm_area_struct數據結構描敘了虛擬內存的起始與結束位置,進程對此內存區域的存取權限以及一組內存操作函數。這些函數都是Linux在操縱虛擬內存區域時必須用到的子程序。其中一個負責處理進程試圖訪問不在當前物理內存中的虛擬內存(通過頁麵失效)的情況。此函數叫nopage。它用在Linux試圖將可執行映象的頁麵調入內存時。
可執行映象映射到進程虛擬地址時將產生一組相應的vm_area_struct數據結構。每個vm_area_struct數據結構表示可執行映象的一部分:可執行代碼、初始化數據(變量)、未初始化數據等等。Linux支持許多標準的虛擬內存操作函數,創建vm_area_struct數據結構時有一組相應的虛擬內存操作函數與之對應。
請求換頁
當可執行映象到進程虛擬地址空間的映射完成後,它就可以開始運行了。由於隻有很少部分的映象調入內存,所以很快就會發生對不在物理內存中的虛擬內存區域的訪問。當進程訪問無有效頁表入口的虛擬地址時,處理器將向Linux報告一個頁麵錯誤。
頁麵錯誤帶有失效發生的虛擬地址及引發失效的訪存方式。Linux必須找到表示此區域的vm_area_struct結構。對vm_area_struct數據結構的搜尋速度決定了處理頁麵錯誤的效率,而所有vm_area_struct結構是通過一種AVL(Adelson-VelskiiandLandis)樹結構連在一起的。如果無法找到vm_area_struct與此失效虛擬地址的對應關係,則係統認為此進程訪問了非法虛擬地址。這時Linux將向進程發送SIGSEGV信號,如果進程沒有此信號的處理過程則終止運行。
如果找到此對應關係,Linux接下來檢查引起該頁麵錯誤的訪存類型。如果進程以非法方式訪問內存,比如對不可寫區域進行寫操作,係統將產生內存錯誤的信號。
如果Linux認為頁麵出錯是合法的,那麼它需要對這種情況進行處理。
首先Linux必須區分位於交換文件中的頁麵和那些位於磁盤上的可執行映象。AlphaAXP的頁表中有可能存在有效位沒有設置但是在PFN域中有非0值的頁表入口。在這種情況下,PFN域指示的是此頁麵在交換文件中的位置。如何處理交換文件中的頁麵將在下章討論。
請到𝐨𝐨𝐩.𝐭𝐰查看完整章節
不是所有的vm_area_struct數據結構都有一組虛擬內存操作函數,它們有的甚至沒有nopage函數。這是因為Linux通過分配新的物理頁麵並為其創建有效的頁表入口來修正這次訪問。如果這個內存區域存在nopage操作函數,Linux將調用它。
一般Linuxnopage函數被用來處理內存映射可執行映象,同時它使用頁麵cache將請求的頁麵調入物理內存中去。
當請求的頁麵調入物理內存時,處理器頁表也必須更新。更新這些入口必須進行相關硬件操作,特別是處理器使用TLB時。這樣當頁麵失效被處理完畢後,進程將從發生失效虛擬內存訪問的位置重新開始運行。
Linux頁麵cache
圖3.6Linux頁麵Cache
Linux使用頁麵cache的目的是加快對磁盤上文件的訪問。內存映射文件以每次一頁的方式讀出並將這些頁麵存儲在頁麵cache中。圖3.6表明頁麵cache由page_hash_table,指向mem_map_t數據結構的指針數組組成。
。來出生派中移偏的件文和edoniSFV的件文從引索的表頁。件文個一敘描以可僅並以可它,的一唯是都edoniSFV個每且並識標來構結據數)敘講中章一統係件文在(edoniSFV個一過通件文個每的中xuniL
。麵頁理物配分之為並存內入讀中統係件文的象映含包從將麵頁此則否;構結據數t_pam_mem向指個一程過理處效失麵頁回返則,中ehcac在麵頁果如。出讀來ehcac麵頁從試嘗統係,中存內回讀麵頁將要時求請頁換生產如例,麵頁出讀中件文射映存內個一從
。除刪中ehcac麵頁從被將它,時用使程進何任被再不即,時麵頁個某要需再不當。長增斷不ehcac麵頁,中程過行執與入讀的象映在
麵頁棄丟與出換
。成完來)dpawsk(程進台後換交心核由務任個這。麵頁理物放釋須必統係子理管存內xuniL,時少減存內理物中統係當
。率效行運統係理管存內持維來麵頁閒空的夠足有中統係證保是標目其。多得多要中件文換交的統係到換交麵頁將僅僅比作工的成完它實其,解誤人使易容字名的程進台後換交心核。行運態心核以上間空址地理物在,程進的存內擬虛有沒是它。程線心核的殊特種一是程進台後換交心核
。用調的性期周器時定換交心核被,行運時動啟統係在程進tini的心核由程進此
過通將程進台後換交心核,時下以wol_segap_eerf至甚hgih_segap_eerf在數麵頁閒空的中統係果如。次一減遞後成完作操入寫當時同,次一增遞將它,時中列隊件文換交到寫備準入排被麵頁有當;值數個這錄記來segap_cnysa_rn用使它,內在算計也數麵頁的中件文換交到寫被前當將程進台後換交心核,中查檢在。時到器時定次一下到眠睡將它;作工何任做不程進台後換交心核,hgih_segap_eerf於大數麵頁閒空的中統係要隻。麵頁些一放釋該否是斷判來wol_egap_eerf和hgih_segap_eerf:量變個兩用使它。少太否是數麵頁閒空的中統係查檢將程進台後換交,後時到器時定當