打印

请高手给以下代码加注释(mmu的理解)

[复制链接]
2169|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
52mcu|  楼主 | 2008-6-17 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下代码来自三星 s3c2440 请高手在疑点处 注释  

#define DESC_SEC    (0x2|(1<<4))

#define RW_CB        (AP_RW|DOMAIN0|CB|DESC_SEC)
#define RW_CNB        (AP_RW|DOMAIN0|CNB|DESC_SEC)
//MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
 MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_CNB);  //bank0 这是在干什么?请高手注释。
MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB);  //bank1
 MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB); //bank2

//这个函数干什么,高手注释
void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
{
    volatile U32 *pTT;
    volatile int i,nSec;
    pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);
    nSec=(vaddrEnd>>20)-(vaddrStart>>20);
    for(i=0;i<=nSec;i++)*pTT++=attr |(((paddrStart>>20)+i)<<20);
}

相关帖子

沙发
52mcu|  楼主 | 2008-6-18 15:40 | 只看该作者

顶一把

使用特权

评论回复
板凳
wuzhenzhi| | 2008-6-19 01:16 | 只看该作者

我的解析

关于段页描述符的设置我已经忘了,不过从你的代码看来其作用是将每个section(段)的首地址赋给一段连续的内存区域(表),通常是用于构建段(页)描述符,即可以通过遍历这个表,就可以访问到每个section,仔细解释如下:
void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
//设置MTT(虚拟地址起始,虚拟地址结束,物理地址起始,属性)
{
    volatile U32 *pTT;//描述符表指针,用于遍历此表
    volatile int i,nSec;//nSec是总共的区域数量,i是遍历用的
    pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);将pTT指向起点(MMU的TT表的起点加上虚拟地址的起点,右移是因为高12位有效,因为19:0是一个section,区分各个section靠的是31:20)
    nSec=(vaddrEnd>>20)-(vaddrStart>>20);//计算总共section的数量
    for(i=0;i<=nSec;i++)*pTT++=attr |(((paddrStart>>20)+i)<<20);//将pTT表中的每一个单元分配一个数值,此数值低位代表段属性,高位为它的物理地址的高12位。
}
它这样做是为了初始化(分配)内存,将虚拟内存空间所需大小的物理空间分配出来,构建段描述符表。我的批注可能不太准确,希望大家指正。

使用特权

评论回复
地板
aibxyz| | 2008-6-19 16:04 | 只看该作者

AP_RW|DOMAIN0|CNB|DESC_SEC

你明白这几个参数的含义
你就明白了
这些代码的用处就是:告诉MMU那些区域是可读写的,可用buffer可用cache的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

292

帖子

0

粉丝