arm el2与el3_armv8 memory translation
AArch32,arm的32bit架構;
AArch64,arm的64bit架構;
ARMv8.2-LPA,是armv8.2中的新feature,擴大了IPA和PA的支持范圍,從48bit擴展到52bit。
armv8-a core內部使用virtual memory,內部通過mmu轉換為physical address。
mmu的好處:
1)允許system同時運行多個task,各個task之間完全是地址透明的。
2)同一個task,code在編寫的時候,也完全不需要了解processor內部的地址分配。
3)mmu還可以實現memory access permission的控制,memory attribute的控制,cache policy的控制。
這樣app的編寫,編譯,鏈接都是在virtual memory space中進行的。
arm提出trustzone之后,定義了兩種physical address space,在理論上,secure和non-secure的physical address
應該是完全分開的兩個地址空間,甚至存儲器,但是在實現中,多通過bus attribute來進行控制。表示的是
同一塊地址,在進行secure和non-secure切換的時候,需要自己保存上下文。
arm規定,non-secure不能訪問secure空間,但是secure是可以訪問secure和non-secure的,這樣的化,在應用中
如果一個secure的master,讀了兩次同一個地址,一次是secure bus讀,一次是non-secure bus讀,這樣在cache
中會出錯,所以一般要求,secure在讀取non-secure的時候,要求使用non-secure bus attr。
mmu內部的translation table根據exception level分為四級:
1) EL0------app
2) EL1------kernel
3) EL2------hypervisor,armv7加入的一個arm core mode,主要為了virtualization。
4) EL3------secure monitor,在trustzone切換過程中的mode。
一般情況下EL0是執行在unprivilege mode下的,其他三種都是執行在privilege mode下的。需要配置自己的TCR寄存器
EL0和EL1都可以執行在non-secure或secure mode下,但是EL2只能執行在non-secure mode下,EL3只能執行在secure mode下。
EL0和EL1的translation table base address是指定在寄存器中,Translation Table Base Registers(TTBR0_EL1)和(TTBR1_EL1)
EL0和EL1的區分是通過VA的高位地址來區分的,OS的地址都在高位,高位都為1;
APP的地址都在低位,高位都為0;
一般是16bit的高位,這樣和32bit級聯起來,剛好48bits
EL2和EL3都只有TTBR0,寄存器分別為TTBR0_EL2和(TTBR0_EL3)
除了base address,還有一個Translation control register(TCR_EL1),其中控制
1)IPA size,最終的PA的范圍大小,3bits,000---32bitsPA,101---48bitsPA
2)TG0/TG1,translation table的size大小,2bits,00---4KB,01---16KB,11---64KB? (Translation Granule)
3)T0SZ/T1SZ,高bits的位數,來區分EL0/EL1的高位,5bits
VA到PA的translation:
對于一個nbits的VA空間的應用,高位64-n必須是全零或者全1,否則mmu會報event error。
VA的低位地址,或直接作為PA中的offset,具體bit是按design而定的。
一個轉換的流程圖,多級轉換:
TTBR0_EL1,TTBR1_EL1以及TCR_EL1都是不區分secure和non-secure的寄存器,所以在secure切換的時候,
必須自己做context的保存。
VMSAv8-64的translation table format descripter:
主要有以下幾個方面,
1) invalid或者valid; bit[0]
2) table entry或者block entry;? bit[1]
descripter與granule的顆粒有關系,
4k granule 16granule 64granule
level0 block entry不支持 block entry不支持 block entry不支持
level1 block entry不支持 block entry不支持(主要看ARMv8.2-LPA是否支持)
level2
對于level3的table,都是支持block entry的,不支持table entry
對于不支持ARMv8.2-LPA的level0-level3的descripter的各種格式,
level3的descripter格式:
amrv8.2中的多級地址映射:
兩級的translations,主要引入了hypervisor的控制,stage1由guest os控制,stage2由hypervisor控制。
1) 主要在level0和level1進行了擴展,可能會有stage2。對于secure的操作,系統中是不允許在做stage2的。
對于non-secure操作,需要配置Hypervisor Configuration Register(HCR_EL2)來進行stage2。
2) EL2和EL3都是只有stage1的,Translation base table,分別有自己的TTBR0_EL2/EL3,secure world是不允許有virtualization的。
3) stage2的 Translation base table寄存器是單獨的VTTBR0_EL2,并且有自己單獨的control寄存器VTCR_EL2
另一類的access的控制,是對執行attr的控制,反應到bus上就是某些instruction的prefetch不能再一些地址上進行。
block/page可以被標識為Execute Never(XN),Unprivilege Execute Never(UXN),Privilege Execute Never(PXN),
通過配置每個level的SCTLR_ELn寄存器來實現。
AF(access flag),是軟件的應用,表明目前該page是否被訪問過,優化在OS memory control中的實現。
Bit[58:55],不論是block descripter還是table descripter,中都會預留,為OS使用。可以存放page是否dirty等信息。
mmu中還包括secure ctrl register(SCR)寄存器,可以定義secure是否可以訪問non-secure的空間,
arm中還定義了指令LDTR和STTR,可以允許在EL1中執行數據的加載和寫入,權限等是按照EL0的配置來執行。
在其他的except level中,LDTR和STTR指令與普通的LDR和STR相同。
TLB(Translation Lookaside Buffer),MMU中訪問page translation的cache,每個TLB的entry,都包括memory type,
cache policy,access permission,ASID,VMID等信息。
如果memory中的translation entry已經更新,但是TLB中的未更新,這時需要OS進行invalidation stale TLB entry。
指令TLBI ,可以指定stage-level,specify-attr等。
ALL,VMALL,VMALLSI2,ASID,VA,VAA
TLB中的entry是區分secure和non-secure的,所以在secure切換的時候,是不需要context-switch的。
總結
以上是生活随笔為你收集整理的arm el2与el3_armv8 memory translation的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三位数的茎叶图怎么看_霍山石斛哪家好?霍
- 下一篇: 12c集群日志位置_Oracle 19C