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

[复制链接]
3453|3
 楼主| 52mcu 发表于 2008-6-17 19:55 | 显示全部楼层 |阅读模式
以下代码来自三星 s3c2440&nbsp;请高手在疑点处 注释&nbsp;&nbsp;<br /><br />#define&nbsp;DESC_SEC&nbsp;&nbsp;&nbsp;&nbsp;(0x2|(1&lt&lt4))<br /><br />#define&nbsp;RW_CB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(AP_RW|DOMAIN0|CB|DESC_SEC)<br />#define&nbsp;RW_CNB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(AP_RW|DOMAIN0|CNB|DESC_SEC)<br />//MMU_SetMTT(int&nbsp;vaddrStart,int&nbsp;vaddrEnd,int&nbsp;paddrStart,int&nbsp;attr)<br />&nbsp;MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_CNB);&nbsp;&nbsp;//bank0 这是在干什么?请高手注释。<br />MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB);&nbsp;&nbsp;//bank1<br />&nbsp;MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB);&nbsp;//bank2<br /><br />//这个函数干什么,高手注释<br />void&nbsp;MMU_SetMTT(int&nbsp;vaddrStart,int&nbsp;vaddrEnd,int&nbsp;paddrStart,int&nbsp;attr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;U32&nbsp;*pTT;<br />&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;int&nbsp;i,nSec;<br />&nbsp;&nbsp;&nbsp;&nbsp;pTT=(U32&nbsp;*)_MMUTT_STARTADDRESS+(vaddrStart&gt&gt20);<br />&nbsp;&nbsp;&nbsp;&nbsp;nSec=(vaddrEnd&gt&gt20)-(vaddrStart&gt&gt20);<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt=nSec;i++)*pTT++=attr&nbsp;|(((paddrStart&gt&gt20)+i)&lt&lt20);<br />}
 楼主| 52mcu 发表于 2008-6-18 15:40 | 显示全部楼层

顶一把

  
wuzhenzhi 发表于 2008-6-19 01:16 | 显示全部楼层

我的解析

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

AP_RW|DOMAIN0|CNB|DESC_SEC

你明白这几个参数的含义<br />你就明白了<br />这些代码的用处就是:告诉MMU那些区域是可读写的,可用buffer可用cache的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

292

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部