mini2440MMU管理建立页表笔记

来源:互联网 发布:安卓软件制作器 编辑:程序博客网 时间:2024/05/18 14:14

近来看韦东山老师的书,发现群里很多朋友对MMU章节搞不太清楚,小弟不才,把自己的理解写下来跟大家分享,高手请飘过:)

韦老师书部分源码如下:

    1、unsigned long virtuladdr, physicaladdr;
    2、unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;
   
    /*
     * Steppingstone的起始物理地址为0,第一部分程序的起始运行地址也是0,
     * 为了在开启MMU后仍能运行第一部分的程序,
     * 将0~1M的虚拟地址映射到同样的物理地址
     */
    8、virtuladdr = 0;
    9、physicaladdr = 0;
    *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
                                            MMU_SECDESC_WB;

    /*
     * 0x56000000是GPIO寄存器的起始物理地址,
     * GPBCON和GPBDAT这两个寄存器的物理地址0x56000010、0x56000014,
     * 为了在第二部分程序中能以地址0xA0000010、0xA0000014来操作GPBCON、GPBDAT,
     * 把从0xA0000000开始的1M虚拟地址空间映射到从0x56000000开始的1M物理地址空间
     */
    18、virtuladdr = 0xA0000000;
    19、physicaladdr = 0x56000000;
    *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
                                            MMU_SECDESC;

    /*
     * SDRAM的物理地址范围是0x30000000~0x33FFFFFF,
     * 将虚拟地址0xB0000000~0xB3FFFFFF映射到物理地址0x30000000~0x33FFFFFF上,
     * 总共64M,涉及64个段描述符
     */
    27、virtuladdr = 0xB0000000;
    28、physicaladdr = 0x30000000;
    while (virtuladdr < 0xB4000000)
    {
        *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
                                                MMU_SECDESC_WB;
        virtuladdr += 0x100000;
        physicaladdr += 0x100000;
    }

首先,程序第2行指定了页表基址为0x30000000,意思是页表从0x30000000这个地址开始存放,由于页表有4096个条目,所以大小为4*4096=16k。

当我们拿到一个32位的虚拟地址,取出其前12位,在页表中寻找条目(如:12位二进制组成的数字是1,就是页表中第一个条目,是2就是第二个条目,依次类推),2的12次方刚好够找4096个。找到条目后,条目的内容大致是这样的:段基址(12位)+控制位(这里具体哪一位是做什么的先不管)。得到的段基址是12位的,从后20位全0到后20位全F,一共表示了1M大小的地址范围。之前我们不是用了虚拟地址的前12位在页表中寻找条目吗,现在用剩下的20位在从段基址开始的1M地址中找到具体的单元。因此,物理地址就应该是:段基址+虚拟地址的后20位;

现在我们再看看程序

第8行开始要完成的功能在注释里有,我们现在主要看看程序是什么意思,韦工这里讲的很简略;

如:*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC_WB;

        mmu_tlb_base 表示页表基址,页表从这里开始存放,也就是sdram刚开始的16k;

        virtuladdr>>20 实际上就得到了虚拟地址的前12位。

        两个加起来就确定了页表中的一个条目;一个条目能寻址1M大小的物理地址;

        等号右边 (physicaladdr & 0xFFF00000) 表示物理地址的前12位,对应上面说的段基址。

        MMU_SECDESC_WB 对后面位赋值。(具体在宏定义里有)

       整句话就完成了对页表中一个条目的赋值。

       18行开始的程序类似;

       27行开始有

        virtuladdr += 0x100000;
        physicaladdr += 0x100000;

        因为一个条目能寻址1M,sdram有64M。所以每次赋值完递增1M。

       以为就是我的理解,有错的地方请大家留言指正。
       

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 钢三开局修改对电脑有用怎么办 我的世界为什么一直黑屏闪退怎么办 苹果6plus玩游戏闪退怎么办 电脑重置开机黑屏了怎么办才好? 龟头有一小块和鱼鳞一样脱皮怎么办 海盗来了赠送碎片密码忘了怎么办 王者荣耀还差几百金币买英雄怎么办 英雄联盟更新后画面突然很卡怎么办 苹果手机微信登陆没反应怎么办 谷歌商店注册短信一直验证怎么办 英雄联盟开游戏退出来进不去怎么办 忘记了路由器和网关的密码怎么办 逆战无尽塔防71关没怪了怎么办 看香的师傅要钱特别多怎么办 电商企业有收入支出没发票怎么办 洗衣液没稀释把衣服染褪色了怎么办 衣服被洗衣液洗褪色了怎么办 b站不小心点了差评怎么办 c盘文件目录损坏且无法读取怎么办 打印发票时发票上的字体变大怎么办 淘宝店铺食品违法遇到打假人怎么办 搜狗输入法说我没有权限安装怎么办 申请移民美国期间护照到期了怎么办 自己申请的qq号账号忘了怎么办 苹果手机下完游戏找不到在哪怎么办 苹果四下游戏的密码忘了怎么办 qq斗地主老自动发消息怎么办 微信小程序斗地主被限制了怎么办 台式电脑玩斗地主总黑屏怎么办 玩斗地主屏幕出现一半玩不了怎么办 电脑qq文件破损或部分丢失怎么办 华为平板电脑开机密码忘记了怎么办 微信被太多人投诉被限制登录怎么办 微信账号被永久封号里面的钱怎么办 乱世王者领礼包时账号异常怎么办 qq填写资料见证号格式错误怎么办 如果把微信注销 王者的号怎么办 93元的吃鸡号忘了激活吗怎么办 王者荣耀实名注册不是自己的怎么办 苹果手机打开qq太慢了怎么办 剪辑视频打开了软件关闭不了怎么办