2009-11-11 91 views
2

如果我理解正確,系統空間中的內存加法器只能從內核模式訪問。這是否意味着當執行系統空間映射的組件時,處理器必須轉換爲內核模式?內核模式轉換

例如:虛擬內存管理器是一個經常使用的組件,映射到系統空間。每當VMM在用戶進程的上下文中運行(可以說它翻譯了地址),處理器是否必須轉換到內核模式?

謝謝, 蘇雷什。

回答

1

以您的虛擬內存管理器爲例,它實際上從不在用戶空間中運行。爲了分配內存,用戶模式應用程序調用Win32 API(NTDLL.DLL作爲一個例子),例程爲VirtualAlloc

關於地址轉換,下面是它的工作原理的總結(基於Windows Internals 5th Edition的內容)。

VMM使用頁表,CPU用它將虛擬地址轉換爲物理地址。頁面表位於系統空間中。每個表包含許多PTE(頁表條目),它存儲虛擬地址映射到的物理地址。在這裏我不會詳細討論,但重點是所有VMM的工作都是在系統空間而不是用戶空間中執行的。

對於上下文切換 - 當用戶空間中運行的線程需要在系統空間中運行時,會發生上下文切換。由於內存管理器存在於系統空間中,因此線程永遠不需要進行上下文切換,因爲它已經存在於系統空間中。

對於簡單解釋的道歉,這是一個相當複雜的討論話題。我強烈建議你拿起Windows Internals的副本,因爲這聽起來像它可以派上用場。

+0

您好,我同意VMM的工作是在系統空間中執行的。讓我們舉個例子。假設發生頁面錯誤,並且陷阱處理程序將調用VMM中的MmAccessFault方法,該方法運行在發生錯誤的線程的上下文中。但是,MmAccessFault方法位於系統空間中,如果處理器需要執行它,則處理器需要處於內核模式。所以,問題是,在方法被調用之前,轉換是否會發生? 我確實擁有Windows Internals的副本(儘管第4版)。謝謝。 – Suresh 2009-11-11 21:49:46

+0

即使在頁表中有效地址的情況下,由於頁表駐留在系統空間中,因爲地址轉換髮生在用戶線程的上下文中,是否需要切換到內核模式? 類似地,當在內核模式下運行的任何組件在用戶模式線程的上下文中運行時,在開始執行之前是否需要切換到內核模式?謝謝。 – Suresh 2009-11-11 21:50:19

+0

無可否認,我無法完全回答您的問題,因爲您需要幫助的深度有點超出我的範圍。我給了它一個,但也許更有知識的Windows專家可以在這裏幫助。 – 2009-11-11 22:10:24

1

通常情況下,涉及2個部分。MMU(內存管理單元)是一個硬件組件,用於執行從虛擬地址到物理地址的轉換。和操作系統虛擬機子系統。

操作系統部分需要以特權模式(也稱爲內核模式)運行,並且將基於用戶空間需求設置/更改MMU中的映射。

E.g.要請求更多(虛擬)內存或將文件映射到內存中,則需要轉換到內核模式,並且VM子系統可以更改進程的映射。

在這附近,通常會有大量的技巧 - 電子克。將內核的整個地址空間映射到用戶進程虛擬空間,但改變它的訪問權限以便進程不能使用該內存 - 這意味着無論何時轉換到內核模式,都不需要重新加載內核映射。

+0

您是否說當執行任何駐留在系統空間的代碼段(無論是VMM還是線程調度程序)時,必須進行內核模式轉換?謝謝。 – Suresh 2009-11-12 00:58:19

+0

是的。請注意,翻譯內存地址等內容是由硬件單元完成的,它不需要代碼執行(除非導致頁面錯誤) – nos 2009-11-12 08:19:42

+0

好的,謝謝。我同意翻譯地址是由硬件完成的,但它仍然需要訪問駐留在系統空間中的頁表嗎?所以,要訪問頁表,應該將處理器切換到內核模式,還是完全由硬件來處理,而不涉及處理器?謝謝。 – Suresh 2009-11-12 20:03:14