mini2440裸机之MMU(二)(mmu…

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
//段(section)是大小为1MB的存储块
// 1) Only the section table is used. 只有段存储块被使用
// 2) The cachable/non-cachable area can be changed by MMT_DEFAULT value.
//    The section size is 1MB.段大小为1MB

extern char __ENTRY[]; 
void MMU_Init(void)
{
      int i,j;
        //========================== IMPORTANT NOTE =========================
    这段程序不能实现当前堆栈和代码区域的重新映射,假如你想让存储区域自由
    映射,需要你自己编写一个细致入微的MMU初始化代码
    //===================================================================
      MMU_DisableDCache();  //禁止数据高速缓存
      MMU_DisableICache();  //禁止指令高速缓存
       //要使用回写操作,一定要对DCache进行清除
 ---------------------------------------------------------------------------------------
    for(i=0;i<64;i++)                     !!!!  我要详细讲解这段!!!!                                          |
        for(j=0;j<8;j++)                                                                                                                                    |
|              MMU_CleanInvalidateDCacheInd ex((i<<26)|(j<<5));  //使整个DCache的数据无效       |
|      MMU_InvalidateICache();    //使整个指令Cache无效                                      |
                                                                                       |
  ---------------------------------------------------------------------------------------     
      #if 0
        //为了快速完成MMU_Init(), Icache在这打开
      MMU_EnableICache(); 
      #endif
       
      MMU_DisableMMU();     //禁止MMU
      MMU_InvalidateTLB();  //使快表无效
[转载]mini2440裸机之MMU(二)(mmu.c)
    //MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
  //MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_CNB);  //bank0
      MMU_SetMTT(0x00000000,0x03f00000,(int)__ENTRY,RW_CB);  //bank0 
      MMU_SetMTT(0x04000000,0x07f00000,0,RW_NCNB);                  //bank0
      MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB);   //bank1
      MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB);  //bank2
      MMU_SetMTT(0x18000000,0x1ff00000,0x18000000,RW_NCNB);  //bank3
    //MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CB);   //bank4
      MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB);    //bank4 for STRATA Flash
  ///Strata Flash是Intel的NOR型闪存
      MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB);  //bank5
        //30f00000->30100000, 31000000->30200000
    //下面3条代码是对s3c2440虚拟地址映射到物理地址(内存)的操作,2440的SDRAM是bank6
      MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);      //bank6-1   1M
      MMU_SetMTT(0x30200000,0x33e00000,0x30200000,RW_NCNB);  //bank6-2  60M
        MMU_SetMTT(0x33f00000,0x33f00000,0x33f00000,RW_CB);      //bank6-3  
      MMU_SetMTT(0x38000000,0x3ff00000,0x38000000,RW_NCNB);  //bank7    127M
       
      MMU_SetMTT(0x40000000,0x47f00000,0x40000000,RW_NCNB);  //SFR      127M
      MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB);  //SFR      303M
      MMU_SetMTT(0x5b000000,0x5b000000,0x5b000000,RW_NCNB);  //SFR
      MMU_SetMTT(0x5b100000,0xfff00000,0x5b100000,RW_FAULT); //not used 如果应用层访问到该区域MMU会报错
       
      MMU_SetTTBase(_MMUTT_STARTADDRESS);    //写转换表基地址到C2
      MMU_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);  //写域访问控制位到C3
          //上句最后C3中内容为0101 0101 0101 0101 0101 0101 0101 0001
        //DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked)
    
MMU_SetProcessId(0x0);  //关闭FCSE(快速上下文切换)
      MMU_EnableAlignFault();  //开启对齐检测
         
      MMU_EnableMMU();        //使能MMU
      MMU_EnableICache();  //使能ICache
      MMU_EnableDCache();  //当MMU打开后,DCache必须要打开
   

// attr=RW_CB,RW_CNB,RW_NCNB,RW_FAULT

void ChangeRomCacheStatus(int attr)
{
      int i,j;
      MMU_DisableDCache();  //禁止数据高速缓存
      MMU_DisableICache();  //禁止指令高速缓存
       //要使用回写操作,一定要对DCache进行清除
      for(i=0;i<64;i++)
        for(j=0;j<8;j++)
              MMU_CleanInvalidateDCacheInd ex((i<<26)|(j<<5));  //使整个DCache的数据无效
      MMU_InvalidateICache();       //使整个指令Cache无效
      MMU_DisableMMU();    //禁止MMU
      MMU_InvalidateTLB();  //使快表无效
      MMU_SetMTT(0x00000000,0x07f00000,0x00000000,attr);  //bank0
      MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,attr);  //bank1
      MMU_EnableMMU();    //使能MMU
      MMU_EnableICache();  //使能ICahe
      MMU_EnableDCache();  //当MMU打开后,DCache必须要打开
     
//设置页表函数
//vaddrStart:虚拟起始地址
//vaddrEnd:虚拟结束地址
//paddrStart:物理起始地址
//attr:访问属性
//虚拟存储空间到物理存储空间的映射是以内存块为单位的:分为1MB/64KB/4KB/1KB
//虚拟存储空间中的一块连续的存储空间被映射成物理存储空间中同样大小的一块连续
//存储空间页表中,每一个地址变换条目实际上就记录了一个虚拟存储空间的存储块的基
//地址与物理存储空间相应的一个存储块的基地址的对应关系

        [转载]mini2440裸机之MMU(二)(mmu.c)
void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
{
      volatile U32 *pTT;    //定义了页表的指针
      volatile int i,nSec;
      pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);  //由于内存块是1M(20bit),写页表的基地址
      nSec=(vaddrEnd>>20)-(vaddrStart>>20);                        // nSec:段大小
      for(i=0;i<=nSec;i++)*pTT++=attr |(((paddrStart>>20)+i)<<20);
//页表存储访问信息和存储块的基地址
//(((paddrStart>>20)+i)<<20) :对应的物理内存页的地址
// attr:访问权限和缓冲属性
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值