2013-11-02 60 views
1

我有一個關於虛擬內存管理的問題,更具體地說是地址轉換。內存地址轉換是否需要額外訪問內存?

當應用程序運行時,CPU接收包含虛擬內存地址的指令,並通過頁表將其轉換爲物理地址。

我的問題是,由於頁表也放在一個內存塊,這是否意味着CPU必須在一次內存訪問指令中訪問內存兩次?如果答案是否定的,那麼這實際上是如何工作的?我錯過了哪一部分?

任何人都可以給我一些細節嗎?

回答

1

像往常一樣,答案既不是,也不是。

最糟糕的情況下,你必須做一個頁表,它確實存儲在(某種)存儲器中,這不一定只有一個查找,它可以是多個查找,例如參見two-level table(示例從維基百科)。

但是,通常這個頁表伴隨着一個稱爲translation lookaside buffer的硬件協助,這本質上是頁表的高速緩存,查找過程可以在this image中看到。它的工作方式與您預期緩存過於有效一樣,如果查找成功,您可以繼續進行物理獲取,如果失敗,則繼續前述的頁面遍歷,然後更新緩存。

這個硬件協助通常實現爲CAM (Content Addressable Memory),這是網絡處理中最常用的東西,但在這裏也非常有用。這是一個內存組件,它不會根據地址進行查找,而是基於'內容'或任何通用密鑰(密鑰不'必須是連續的,遞增的數字)。在這種情況下,密鑰將是您的虛擬地址,並且生成的內存查找將是您的物理地址。由於這個CAM是一個獨立的組件,而且速度非常快,所以只要你點擊它就不會產生虛擬 - >物理地址轉換的額外內存開銷。

你可以問爲什麼他們不把整個頁表放入CAM中?很簡單,CAM的價格相當昂貴,而且更重要的是相當耗能,所以你不想讓它們變得太大(我們不希望筆記本電腦需要1KW的電力才能運行)。

0

有時。

MMU包含虛擬到物理地址映射的緩存,稱爲TLB(轉換後備緩衝區)。

如果所討論的頁面不在TLB中(TLB未命中),那麼它需要首先將相關的頁表從主內存加載到該緩存中,這將需要額外的內存訪問。最後,如果根本找不到頁面,則向CPU發出陷阱(頁面錯誤),並且CPU有機會解決這個問題 - 例如,分配內存,從文件加載塊,交換空間等。

有關如何完成這些操作的詳細信息因體系結構而異,在某些情況下,TLB未命中還涉及CPU配置TLB,儘管大部分情況都是自動的。 (但是CPU在執行上下文切換時將不得不刷新TLB,併爲例如新過程加載新的頁表)

更多信息例如這裏https://www.kernel.org/doc/gorman/html/understand/understand006.html