tiny6410的MMU的配置于使用

来源:互联网 发布:动态分配二维数组 编辑:程序博客网 时间:2024/04/29 15:14

由手册《Arm1176jzfs》的第六节可知,tiny6410MMU的配置与使用需要分三步:

1、建立一级页表

/* 
 * 用于段描述符的一些宏定义
 */ 
#define MMU_FULL_ACCESS     (3 << 10)   /* 访问权限 */
#define MMU_DOMAIN          (0 << 5)    /* 属于哪个域 */
#define MMU_SPECIAL         (1 << 4)    /* 必须是1 */
#define MMU_CACHEABLE       (1 << 3)    /* cacheable */
#define MMU_BUFFERABLE      (1 << 2)    /* bufferable */
#define MMU_SECTION         (2 << 0)         /* 表示这是段描述符 */


#define SECDESC (MMU_SECTION | MMU_SPECIAL | MMU_DOMAIN | MMU_FULL_ACCESS)
#define MMU_SECDESC_WB      (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_CACHEABLE | MMU_BUFFERABLE | MMU_SECTION)




void create_page_table(void)
{
    unsigned long *ttb = (unsigned long *)0x50000000;
    unsigned long vaddr, paddr;


    vaddr = 0xA0000000;
    paddr = 0x7f000000;
    *(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC;
   /*内存映射*/
    vaddr = 0x50000000;
    paddr = 0x50000000;
    while (vaddr < 0x54000000)
    {
        *(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC_WB;
        vaddr += 0x100000;
        paddr += 0x100000;
    }


}

2、写入TTB

/*设置TTB*/
    "ldr r0, =0x50000000\n"                  
    "mcr p15, 0, r0, c2, c0, 0\n"    
    

3、使能MMU

void mmu_init()
{
   __asm__(
    
    /*设置TTB*/
    "ldr r0, =0x50000000\n"                  
    "mcr p15, 0, r0, c2, c0, 0\n"    
    
    /*不进行权限检查*/
    "mvn r0, #0\n"                   
    "mcr    p15, 0, r0, c3, c0, 0\n"    
    
    
   /*使能MMU*/
    "mrc    p15, 0, r0, c1, c0, 0\n"    
    "orr    r0, r0, #0x0001\n"          
    "mcr    p15, 0, r0, c1, c0, 0\n"    
    : 
    : 
  );
}

然后在主函数中调用这两个函数就可以了。

0 0
原创粉丝点击