本文主要是介绍【补充】 关于*(mmu_tlb_base + (virtuladdr 20))的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
来看代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
我们根据上面可以得到:段描述符的地址=Translation base(高18位)-TTB bit[31-14]+Table index(低12位)-MVA bit[31-20]+00(低两位)不少人会以为*(mmu_tlb_base | virtuladdr>>18)才是正确的。
解释:
首先mmu_tlb_base是一个unsigned long *型,而virtuladdr是unsigned long型,位或操作会出错!
查阅资料可知,一级页表的地址TTB必须16KB对齐,且位[14:0]必为0!
所以我们用+
和|
是一样的。而我们的mmu_tlb_base是unsigned long*型的,
在32位中,mmu_tlb_base + 1 = mmu_tlb_base + 1*sizeof(unsigned long*)
=mmu_tlb_base + 4
所以我们mmu_tlb_base + (virtuladdr >> 20) = mmu_tlb_base +( (virtuladdr >> 20))* 4 = mmu_tlb_base +( (virtuladdr >> 20))<<2 = mmu_tlb_base + (virtuladdr >>18
实验验证:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
结果:
这篇关于【补充】 关于*(mmu_tlb_base + (virtuladdr 20))的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!