地址映射原理和实现
来源:互联网 发布:车载手机支架知乎 编辑:程序博客网 时间:2024/05/21 09:00
简介 为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射
地址映射原理及实现
1、 地址映射结构
在Tornado\target\h\vmLib.h文件中 typedef struct phys_mem_desc { void *virtualAddr; void *physicalAddr; UINT len; UINT initialStateMask; /* mask parameter to vmStateSet */ UINT initialState; /* state parameter to vmStateSet */ } PHYS_MEM_DESC; virtualAddr:你要映射的虚拟地址 physicalAddr:硬件设计时定义的实际物理地址 len;要进行映射的地址长度 initialStateMask:可以初始化的地址状态: 有如下状态: #define VM_STATE_MASK_VALID 0x03 #define VM_STATE_MASK_WRITABLE 0x0c #define VM_STATE_MASK_CACHEABLE 0x30 #define VM_STATE_MASK_MEM_COHERENCY 0x40 #define VM_STATE_MASK_GUARDED 0x80 不同的CPU芯片类型还有其特殊状态 initialState:实际初始化的地址状态: 有如下状态: #define VM_STATE_VALID 0x01 #define VM_STATE_VALID_NOT 0x00 #define VM_STATE_WRITABLE 0x04 #define VM_STATE_WRITABLE_NOT 0x00 #define VM_STATE_CACHEABLE 0x10 #define VM_STATE_CACHEABLE_NOT 0x00 同样不同的CPU芯片类型还有其特殊状态2、 初始化结构
在 Tornado\target\config\ads860\sysLib.c 文件中: PHYS_MEM_DESC sysPhysMemDesc [] = { { (void *) LOCAL_MEM_LOCAL_ADRS, (void *) LOCAL_MEM_LOCAL_ADRS, LOCAL_MEM_SIZE , VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE }, { (void *) BCSR0, (void *) BCSR0, 0x00001000, /* 4 k - Board Control and Status */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_GUARDED, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT | VM_STATE_GUARDED }, …… { (void *) INTERNAL_MEM_MAP_ADDR, (void *) INTERNAL_MEM_MAP_ADDR, INTERNAL_MEM_MAP_SIZE, /* 64 k - Internal Memory Map */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_GUARDED, VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT | VM_STATE_GUARDED }, { (void *) ROM_BASE_ADRS, (void *) ROM_BASE_ADRS, ROM_SIZE, /* Flach memory */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE , VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT } }; 上面结构中是缺省地址映射。3、 地址初始化
在Tornado\target\src\config\ usrMmuInit.c 文件中 通过函数usrMmuInit使地址映射生效4、 实现映射
如你定义flash地址为0x04000000开始的8Mbyte地址,则可以如下进行地址映射 { (void *) 0x04000000, (void *) 0x04000000, 0x00800000, /* 8 m - Flash window 1 */ VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE, VM_STATE_VALID | VM_STATE_WRITABLE },5、 注意
地址映射最小单位为1页,4K大小,所以len值最小为:0x00001000 0 0
- 地址映射原理和实现
- 地址映射原理和实现
- OO映射场景设计和实现原理
- Linux下地址映射原理
- SkyEye的地址映射接口的设计和实现
- cache和内存的地址映射方式(和组成原理讲的差不多)
- MFC 消息映射实现原理
- 利用路由器NAT实现端口地址映射
- 利用NAT实现端口地址映射
- nat123内网地址公网映射实现
- S5PC100的地址映射和启动过程
- ioremap和iounmap -- 内核态地址映射
- 进程地址空间和内存文件映射
- 6.地址映射和外部存储器
- 虚拟地址和物理地址及其映射
- 寄存器名称和地址的映射分析
- Cache和主存地址映射关系
- 域名和本机ip地址映射
- Factory
- 博客前记
- Gradle Project项目、Module模块导入
- pthread_cleanup_push()/pthread_cleanup_pop()的详解
- 设置监听事件四种方法
- 地址映射原理和实现
- 用 Hadoop 进行分布式并行编程
- LINUX 安装ftp详细步奏及用ftp在服务之间传输文件
- 数组--C语言中关于数组的小问题
- 2012年5月SAT香港真题解析
- Eclipse提示No java virtual machine
- leetCode 48.Rotate Image (旋转图像) 解题思路和方法
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoa
- 代理服务器