关于*(mmu_tlb_base + (virtuladdr >> 20))的理解
对于MVA到PA转换过程,以及描述符所扮演的角色,请看下图:
来看代码:
unsigned long virtuladdr, physicaladdr;
unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;//对应上图TTB
virtuladdr = 0xA0000000;//对应上图MVA
physicaladdr = 0x56000000;//对应上图PA
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
MMU_SECDESC;
//*(mmu_tlb_base + (virtuladdr >> 20)) =
//*(TTB[31-14]+MVA[31-20]+00) = *(描述符地址)
//这里作用就是将描述符的值给定(bit[31-20]为PA的[31-20],bit[19-0]自己给定一些段描述符的操作),CPU系统自动根据此发生操
我们根据上面可以得到:段描述符的地址=Translation base(高18位)-TTB bit[31-14]+Table index(低12位)-MVA bit[31-20]+00(低两位)不少人会以为*(mmu_tlb_base | virtuladdr>>18)才是正确的。