原文地址:mini2440裸机之MMU(一)(mmu.h)
作者:智在天涯
#include "2440slib.h"
#ifndef __MMU_H__
#define __MMU_H__
#ifdef __cplusplus
extern "C" {
#endif
#define DESC_SEC (0x2|(1<<4))
//段描述符(看下图)
#define CB
(3<<2)
//cache_on, write_back回写
#define CNB
(2<<2)
//cache_on, write_through直写
#define NCB
(1<<2)
//cache_off,WR_BUF on
#define NCNB
(0<<2)
//cache_off,WR_BUF off
#define AP_RW
(3<<10)
//supervisor=RW, user=RW
#define AP_RO
(2<<10)
//supervisor=RW, user=RO
#define __MMU_H__
#ifdef __cplusplus
extern "C" {
#endif
#define DESC_SEC
#define CB
#define CNB
#define NCB
#define NCNB
#define AP_RW
#define AP_RO
//Domain域可以填写的值有4个
//00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault
//01:当前级别下,该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查
//10:保留状态(我们最好不要填写该值,以免引起不能确定的问题)
//11:当前级别下,对该内存区域的访问都不进行权限检查
#define DOMAIN_FAULT (0x0)
// 不可访问
#define DOMAIN_CHK
(0x1)
// 访问受页表项中设置的权限值控制
//00:当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault
//01:当前级别下,该内存区域的访问必须配合该内存区域的段描述符中AP位进行权检查
//10:保留状态(我们最好不要填写该值,以免引起不能确定的问题)
//11:当前级别下,对该内存区域的访问都不进行权限检查
#define DOMAIN_FAULT
#define DOMAIN_CHK
#define DOMAIN_NOTCHK
(0x3)
// 访问不受控制,不产生权限中止
#define DOMAIN0
(0x0<<5)
// 第0个域
#define DOMAIN1
(0x1<<5)
// 第1个域
#define DOMAIN0
#define DOMAIN1
// 域访问控制寄存器C3的格式
//┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
//│15│14│13│12│11│10│9 │8 │7 │6 │5 │4 │3 │2 │1 │0 │
//└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
// ================================================================
// 访问 位域值 说明
// ================================================================
// 管理者 11 访问不受控制,不产生权限中止
// 保 留 10 不可预料
// 客 户 01 访问受页表项(AP)中设置的权限控制
// 不可访问 00 产生域错误
// ================================================================
#define DOMAIN0_ATTR (DOMAIN_CHK<<0)
// 域0属性,访问受页表项中设置的权限值控制
//由于domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是01,系统会对该访问进行访问权限的检查
//假设当前CPU处于Supervisor模式下,则程序可以对该描述符描述的内存区域进行读写操作
#define DOMAIN1_ATTR (DOMAIN_FAULT<<2) // 域1属性,不可以访问
//┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
//│15│14│13│12│11│10│9 │8 │7 │6 │5 │4 │3 │2 │1 │0 │
//└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
// ================================================================
// 访问
// ================================================================
// 管理者
// 保
// 客
// 不可访问
// ================================================================
#define DOMAIN0_ATTR
//由于domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是01,系统会对该访问进行访问权限的检查
//假设当前CPU处于Supervisor模式下,则程序可以对该描述符描述的内存区域进行读写操作
#define DOMAIN1_ATTR
//由于domain=2,而DOMAIN ACCESS CONTROL REGISTER中field 1的值是00,当前级别下,该内存区域不允许被访问,任何的访问都会引起一个domain fault
#define RW_CB
(AP_RW|DOMAIN0|CB|DESC_SEC)
// 读写,属于第0域,cache开,回写,段描述符
#define RW_CNB
(AP_RW|DOMAIN0|CNB|DESC_SEC)
// 读写,属于第0域,cache开,直写,段描述符
#define RW_NCNB
(AP_RW|DOMAIN0|NCNB|DESC_SEC)
// 读写,属于第0域,cache关,WR_BUF off,段描述符
#define RW_FAULT (AP_RW|DOMAIN1|NCNB|DESC_SEC)
// 读写,属于第1域,cache关,WR_BUF off,段描述符
#define RW_CNB
#define RW_NCNB
#define RW_FAULT
void MMU_Init(void);
void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr);
void ChangeRomCacheStatus(int attr);
#ifdef __cplusplus
}
#endif
}
#endif
#endif