2011-12-12 67 views
7

Linux是操作系統,ARM是本文中提到的處理器。TLB中的內核內存(虛擬地址條目)?

TLB是否包含內核和用戶空間虛擬地址? 內核內存從0xc000_0000開始,前往0xFFFF_FFFF 其中前3 GB屬於用戶空間。在進程之間的上下文切換之間,TLB被刷新。

TLB是否包含內核和用戶空間虛擬地址?

內核內存(虛擬)直接對應物理內存(正好用0xC000_0000抵消會給我們物理地址)。是否有必要在TLB中擁有內核內存(虛擬)(如果你說它存在於TLB中)?它應該只有用戶空間地址。

回答

7

爲什麼我們有虛擬到現代CPU物理地址的轉換的主要原因是爲了更有效和更好地控制使用的內存,可以讓我們:

  1. 分配任何物理內存,RAM,(連續或不),並使其可以在虛擬地址空間的任何地方(連續或不連續)進行訪問,而不會浪費內存到碎片。
  2. 用磁盤或其他內存擴展物理內存RAM。
  3. 使地址空間的某些部分僅爲可讀或不可執行或僅內核等,並保護它們免受未授權或錯誤的訪問。
  4. 隔離應用程序彼此的記憶以進一步改善保護,安全性和可靠性。
  5. 共享內存。 ...

而頁表使這一切成爲可能。

您確實希望能夠在內核的虛擬地址空間中映射和取消映射物理內存,通常這種翻譯機制在整個系統中都能正常工作。當然,翻譯的代價是你現在需要諮詢和維護頁面表,並且會導致性能下降。但全部不丟失:

  1. TLBs在一定程度上緩解了這個問題。他們緩存翻譯。
  2. 更大的頁面(例如ARMv7-Alarge pagessections)可以提供更多幫助,因爲它們需要更少的TLB條目,每單位翻譯的內存。
  3. 也有像global pages的東西。當您在應用程序之間切換並需要刷新當前的TLB時,可以通過執行Invalidate TLB entries by ASID match與應用程序的ASID來避免使TLB中的全局頁面失效。如果您將內核的頁面標記爲全局,則不會使其翻譯無效,並且內核本身不會遭受不必要的TLB失效。

見,例如, 「ARM®架構參考手冊ARM®v7-A和ARM®v7-R版」 爲相關的ARM Virtual Memory System Architecture(VMSA),頁表,TLB等具體細節

5

有兩種類型的虛擬地址的Linux內核使用:

  1. 你已經在該行的「內核內存(虛擬)直接 對應的物理內存提到什麼(只是0xC000_0000將 給予補償我們的實際地址)「。這映射到連續的物理地址。
  2. 使用vmalloc。

第一種是使用宏完成:

include/asm-x86/page_32.h 

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) 
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 

_pa(x)的確實的虛擬到物理轉換。請注意,這個翻譯是在編譯時內聯的。沒有頁面表翻譯發生。這最後一句話非常重要。

另一方面,使用第二種方法,您可以分配虛擬內存中連續的內存,但物理內存中可能不會這樣。現在,在這種情況下,當您第一次訪問虛擬地址時,需要整頁表格轉換。問題是這是誰?

在CISC機器(如x86)的情況下,MMU(硬件)在TLB未命中(首次訪問虛擬地址)的情況下執行該操作並更新頁表。對於內核虛擬地址(通過vmalloc獲取),它們保留爲TLB條目。它們被稱爲全局條目,當進程上下文切換髮生時,它們大多被忽略,而不像其他進程地址空間條目那樣被刷新。但是,當您執行vfree以釋放關聯的虛擬內存時,這些條目將被刪除。

在RISC機器(如MIPS)的情況下,頁面轉換由軟件處理。 TLB未命中後,硬件引發異常。陷阱句柄以內核模式運行以執行翻譯並使用特殊指令更新TLB。從陷阱處理程序返回後,運行相同的代碼行併發生TLB命中。

請參考:http://pages.cs.wisc.edu/~remzi/OSFEP/vm-tlbs.pdf

的底線是,並非所有的內核地址映射您所描述的方式。對於你的情況,物理地址是在編譯時本身生成的。那麼,爲什麼要添加一個TLB條目。對於來自vmalloc的地址,存在TLB條目。當進程之間發生上下文切換時,不需要刷新整個TLB,並且可以保留內核的vmalloc創建的全局條目。當你使用vfree時,相應的全局條目將被刷新。

+0

ARM是一款RISC機器,我想它的工作方式與MIPS描述的相同。但我不確定。不過,我相信您的問題可以在不考慮處理器架構的情況下得到充分回答。 – trans1st0r

+0

看起來像[ARM does硬件頁面漫遊](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0333h/I1029222.html)。除了TLB未命中開銷較低的顯而易見的優勢之外,這允許推測TLB預取,這對於軟件TLB未命中處理來說並不可行。另外http://stackoverflow.com/questions/28019266/arm-mmu-and-arm-linux-page-table-walk。我發現的ARM文檔提到了關於禁用頁面漫遊位的一些內容,所以也許ARM可以使用軟件頁面漫遊,而不像x86。 –