完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
是4B的一级描述符,图上写错了,抱歉
这个是韦老师MMU实验的C语言源码,可以正常使用,但是问题来了,4B的描述符地址的[1:0]位应该是00啊,也就是4字节对齐啊,可是这里明显不是4字节对齐,而是1字节对齐 我找了一下完全开发手册,里面的MMU段地址转换过程图如下所示 也就是说,这里的VA是右移18位,并不是像韦老师源码里的右移20位,可是我把韦老师的源码改为右移18位后,发现程序无法正常跑起来,这是为什么呢? 有没有人亲手写过MMU实验的?能不能帮我分析分析? |
|
相关推荐
3个回答
|
|
你要知那20bit是用来干什么的~用来区别1M空间的地址。
|
|
|
|
2∧20刚好等于1M
|
|
|
|
时间过得有点久了,最近重新看了一下mmu部分。我发现这个问题的答案是什么了。
一开始我还是弄不懂为什么,但是后来我看了一下反编译代码,发现有这么几句: unsigned long virtuladdr, physicaladdr; unsigned long *mmu_tlb_base = (unsigned long *)0x30000000; virtuladdr = 0xA0000000; physicaladdr = 0x56000000; *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC; 以上是编译前的c语言源代码 以下是编译后经过反编译的汇编代码 e0: e3a02c0a mov r2, #2560 ; 0xa00 e4: e3a0120b mov r1, #-1342177280 ; 0xb0000000 e8: e78c3102 str r3, [ip, r2, lsl #2] 第一句代码是0xa000 0000左移20位后得出的数,作为偏移码,而第三句则是将r3中的描述符放入0x3000 0000+(0xa00<<2)中,这里就是问题之处,明明代码中写的是右移20位,可是在真正存入指针所指的地址的时候,却又左移了两位,刚好就是18位。 一开始我还不明白为什么会右移20位之后又重新左移两位,后来看了一下c代码,指针的类型都是unsigned long型的,自增1的时候,地址会自增4,例如有如下定义: unsigned long *p1=0x3000 0000; p1++;//此时p1=0x3000 0004 或者 p1=p1+4;//此时p1=0x3000 0000+4*4 即 p1=0x3000 0000+(4<<2) 所以c代码中的: *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC; 之所以virtuladdr>>20,就是因为mmu_tlb_base是unsigned long型的指针,所以左移20位后会再次乘4,即左移两位 |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2187 浏览 6 评论
1987 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4545 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 03:29 , Processed in 0.503514 second(s), Total 47, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号