关于ADS下bootloader之MMU的深入研究_第1页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、关于ads下bootloader之mmu的深入研究如下是ads下的boot的mmu.c的mmu初始化代码。在2440init.s中跳入main,这个main函数在u2440mom.c中实现,这个main函数包括了对端口,中断服务,mmu,vga等的初始化函数的调用。mmu.c中举行了mmu的初始化,其中调用了无数初始化函数,用法汇编写的,确切的说是用协处理命令写的。这些函数的声明部分在2440slib.h,实现在2440slib.c中。在mmu的初始化程序mmu_init中,首先禁止了dcache,icache,清除了dcache和icache。禁止了mmu,tlb。然后对存储系统举行了虚拟地

2、址到物理地址的映射。然后设置了转化表的基地址,设置了域,开启了mmu,icache,dcache。void mmu_init(void)int i,j;/= important note =/the current stack and code area can't be re-mapped in this routine./if you want memory map mapped freely, your own sophiscated mmu/initialization code is needed./=mmu_disabledcache();mmu_disableicache

3、();/if write-back is used,the dcache should be cleared.for(i=0;i64;i+)for(j=0;j8;j+)mmu_cleaninvalidatedcacheindex(i26)|(j5);mmu_invalidateicache();if 0/to complete mmu_init() fast, icache may be turned on here.mmu_enableicache();endifmmu_disablemmu();mmu_invalidatetlb();/mmu_setmtt(int vaddrstart,i

4、nt vaddrend,int paddrstart,int attr)/mmu_setmtt(0x00000000,0x07f00000,0x00000000,rw_cnb); /bank0if(rbwscon&0x6)/nor启动mmu_setmtt(0x00000000,0x07f00000,0x00000000,rw_ncnb); /bank0else/nand 启动mmu_setmtt(0x00000000,0x00001000,0/*(int)_entry*/,rw_cb); /bank0/mmu_setmtt(0x04000000,0x07f00000,0,rw_ncnb

5、); /bank0mmu_setmtt(0x08000000,0x0ff00000,0x08000000,rw_ncnb); /bank1mmu_setmtt(0x10000000,0x17f00000,0x10000000,rw_ncnb); /bank2mmu_setmtt(0x18000000,0x1ff00000,0x18000000,rw_ncnb); /bank3/mmu_setmtt(0x20000000,0x27f00000,0x20000000,rw_cb); /bank4mmu_setmtt(0x20000000,0x27f00000,0x20000000,rw_ncnb)

6、; /bank4 for strata flashmmu_setmtt(0x28000000,0x2ff00000,0x28000000,rw_ncnb); /bank5mmu_setmtt(0x30000000,0x30100000,0x30000000,rw_cb); /bank6-1 1mmu_setmtt(0x30200000,0x33e00000,0x30200000,rw_ncnb); /bank6-2 60/mmu_setmtt(0x33f00000,0x33f00000,0x33f00000,rw_cb); /bank6-3mmu_setmtt(0x38000000,0x3ff

7、00000,0x38000000,rw_ncnb); /bank7mmu_setmtt(0x40000000,0x47f00000,0x40000000,rw_ncnb); /sfr 127mmu_setmtt(0x48000000,0x5af00000,0x48000000,rw_ncnb); /sfr 303mmu_setmtt(0x5b000000,0x5b000000,0x5b000000,rw_ncnb); /sfrmmu_setmtt(0x5b100000,0xfff00000,0x5b100000,rw_fault);/not usedmmu_setttbase(_mmutt_s

8、tartaddress);mmu_setdomain(0x55550|domain1_attr|domain0_attr);/domain1: no_access, domain0,2"15=client(ap is checked)mmu_setprocessid(0x0);mmu_enablealignfault();mmu_enablemmu();mmu_enableicache();mmu_enabledcache(); /dcache should be turned on after mmu is turned on.for(i=0;i64;i+)for(j=0;j8;j

9、+)mmu_cleaninvalidatedcacheindex(i26)|(j5);mmu_invalidateicache();这里是由于920t有64路,每路有8个组。所以。为什么要i26,j5呢,看下图便知这是一个mmu的虚拟地址向物理地址映射的函数。通过上边的调用可以看到物理地址和虚拟地址的地址是相同的,那为什么还要开mmu呢,不是多此一举吗,dcache的开启必需在mmu开启后才干开启,icache不受mmu影响。开启cache对系统性能会有很大提升。所以,哈哈。这里_mmutt_startaddress是转换表的基址,由于没有用法复杂的操作系统,所以只用法了一级页表,每个页表项对

10、应的是一个1mb的段。ptt=(u32 *)_mmutt_startaddress+(vaddrstart20);相当于获得相应的页表项。看一下下图就会明了。nsec=(vaddrend20)-(vaddrstart20);这句是计算有几个段。for(i=0;i=nsec;i+)*ptt+=attr |(paddrstart20)+i)20);分离映射每段。attr是域。void mmu_setmtt(int vaddrstart,int vaddrend,int paddrstart,int attr)volatile u32 *ptt;volatile int i,nsec;ptt=(u32 *)_mmutt_startaddress

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论