
思考:
頁表最大支持幾級頁表查詢?虛擬地址的有效位一般是多少?最大是多少?虛擬地址的高16bit的用途?查詢到的頁面的大小,可以是多大?
(相關資料圖)
Memory Management Unit (MMU)的主要功能就是 能夠讓系統在執行多任務時,作為一個獨立的程序運行它自己的虛擬地址空間中,它們無需知道真正的物理地址是什么。開啟MMU的硬件框圖如下所示:
Virtual and physical memory的映射圖如下所示:
TLB中不僅僅包含物理地址和虛擬地址,它還包含一些屬性,例如:memory type、cache policies、access permissions、ASID、VMID注:ASID - Address Space ID, VMID - Virtual Machine ID
TLB擁有固定數目的entries,所以你可以通過減少外部內存地址轉換的次數來提升TLB hit率.
在ARMV8 architecture中有一個TLB中的feature叫contiguous block entries,它表示一個entry可以對應多個blocks.。一個entry找到多個blocks,再通過index來查找具體是哪個block。頁表的block entries中,也有一個contiguous bit。這個bit為1,則表示開啟了TLB的contiguous block entries feature。contiguous block entries feature要求alignment,例如:
16 × 4KB adjacent blocks giving a 64KB entry with 4KB granule. 緩存64kb blocks,只需16 enties32 × 32MB adjacent blocks giving a 1GB entry for L2 descriptors, 128 × 16KB giving a 2MB entry for L3 descriptors when using a 16KB granule.32 × 64Kb adjacent blocks giving a 2MB entry with a 64KB granule.如果支持了contiguous bit,那么:TLB查詢后的PA = TLB entry中的PA + index。
如果開啟了contiguous bit,而要轉換的table entries卻不是連續的,或者entries的output在地址范圍之外或沒有對齊,那么將會產生TLB abort。
如果os修改了頁表(entries),那么os需要告訴TLB,invalid這些TLB entries,這是需要軟件來做的. 指令如下:
TLBI < type >< level >{IS} {, < Xt >}
ARM文檔說:因為應用程序切換時要切換頁表,頁表經常改變,而kernel切換時不需要切換頁表,頁表幾乎不改。所以ARM就提供了 a number of features,也就是TTBR0和TTBR1兩個頁表基地址。
TTBR0用于0x00000000_00000000 - 0x0000FFFF_FFFFFFFF虛擬地址空間的翻譯,TTBR1用于0xFFFF0000_00000000 - 0xFFFFFFFF_FFFFFFFF虛擬地址空間的翻譯。
EL2/EL3只有TTBR0,沒有TTBR1,所以EL2/EL3的虛擬地址空間是:0x0000FFFF_FFFFFFFF
MMU除了完成地址的翻譯,還控制訪問權限、memory ordering、cache policies。
如圖所示,列出了三種類型的entry信息:
bits[1:0]表示該輸出是block address,還是next level table address,還是invalid entry
有三種granule sizes的頁表:4kb、16kb、64kb
MMU使用translation tables 和 translation registers控制著cache policy、memory attributes、access permissions、va到pa的轉換
標簽: