[嵌入式Linux应用开发完全手册][韦东山]讲解MMU的时候,构造段描述符地址的语句是否有误

求助]这本书在讲解MMU的时候,构造段描述符地址的语句是否有误~!?
我指的是例子代码那里,例如:

*(mmu_tlb_base+virtuladdr>>20)

书上就是这样构造一级页表的段描述符存储地址,但是此处的virtual address在向右移动了20位之后并没有再向左移动4位~!

virtual address右移8位的意思应该是要找出地址所在的段,然后再向左移4位应该是使得最后构造的段描述符存储地址的低两位为0,从而提取段描述符,但是书上例子并没有这样做,可是我看Linux内核的启动代码的时候发现了在构造一级页表的时候这个virtual address只移动了18位,就因为这两者的不同,我困惑了很久,望高手解答~!
 
解答:由这个式子:段描述符的地址=Translation base(高18位)+Table index(低12位)+00(低两位)不少人会以为
*(mmu_tlb_base+virtuladdr>>18)才是正确的。

其实不然,这其实是指针操作的问题,主要是要注意到(mmu_tlb_base+1)的正确含义。结合者汇编的知识理解,它不是指移动了一个字节,而是移动了一个存储单元,即4个字节。所以原式中virtuladdr>>20多移了2位,即缩小了4倍,而在进行(mmu_tlb_base+virtuladdr>>2)时会将这4倍补回来,正好符合va向右移动18的要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值