地址映射原理和实现

  简介  为了保证 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值