一般在ARM架构的CPU上,物理地址都是统一编址的,寻址空间为4GB(32Bit CPU)。也就是说,针对一个ARM的处理器,它可以访问的物理空间是4GB。在WinCE中,ARM中的4GB物理地址空间将被映射为512MB的虚拟内存空间。OEMAddressTable就是一个4GB物理地址空间到WinCE Kernel中的512MB虚拟地址空间的映射表。

  在BSP中,会定义OEMAddressTable来描述系统中可访问的物理空间及对应的虚拟地址空间,还有大小。这个表会在WinCE系统开始启动的时候传给MMU,具体到BSP中应该是在OAL中的startup.s中,OEMAddressTable的起始地址会被放到r0寄存器中,然后就跳转到KernelStart里面,KernelStart会用OEMAddressTable完成MMU得初始化。当WinCE启动以后,就只能访问虚拟地址空间了。

  举个例子,比如我们要开发一个Flash的驱动程序,那么首先我们知道这个flash所接的片选对应的物理起始地址是多少(假如是0x60000000),大小是多少(假如是0x2000000)。如果我们要在WinCE中访问它,就必须为它定义一个虚拟地址(假如是0x80000000),并添加到OEMAddressTable中,这样,我们才能在我们的驱动里面通过这个虚拟地址访问到flash。

  虚拟地址不是随便定义的,WinCE中有规定,必须在0x80000000---0x9FFFFFFF。实际上WinCE创建了两套虚拟地址空间,一个是0x80000000---0x9FFFFFFF,是Cache Enabled。另一个是0xA0000000---0xBFFFFFFF,是Cache Disabled。有啥区别呢:

  如果我们访问的这个空间只是一段内存空间(比如SDRAM),那么就可以用Cache Enabled的空间来访问,这样存取数据的速度会比较快,因为数据被保存在Cache中。

  如果我们访问的这个空间是一个外设的地址,那么我们就要使用Cached Disabled的空间来访问,这样才能使CPU与外设同步。

  可能说得有点绕,我的经验就是:只要是SDRAM,可以用Cache Enabled空间访问。如果是寄存器,就用Cache Disabled空间访问。

  如何定义OEMAddressTable呢,如果安装了WinCE5.0或者6.0,那么提供的参考BSP中都已经有定义了,在BSP目录下搜索“OEMAddressTable”,一看代码就明白了,这里重复一下,格式如下:

  虚拟地址        物理地址        大小

  比如:

  OEMAddressTable:

  dd       0x80000000     0x60000000    0x2000000

  dd       0               0              0

  上面这个表定义了一个flash的物理地址到虚拟地址的映射,物理地址是0x60000000,虚拟地址是0x80000000,大小是32MB。OEMAddressTable最后必须以0结尾,表示OEMAddressTable结束。

  总之,说白了就是一张物理地址/虚拟地址映射表,当我们要在WinCE中要访问相关硬件的时候,查查这张表,然后通过虚拟地址就可以访问了。如果没有定义,自己添加一个物理地址到虚拟地址的映射就好了

转载于:https://www.cnblogs.com/gmh915/archive/2009/01/08/1945442.html

OEMAddressTable介绍相关推荐

  1. 【转载】WINCE物理和虚拟地址的问题

    转载自:http://www.cnblogs.com/andyhere/archive/2008/10/23/1318105.html WINCE物理和虚拟地址的问题 在MAP.A中地址映射表转换物理 ...

  2. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  3. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  4. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  5. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...

  6. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...

  7. Pytest - 使用介绍

    1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...

  8. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

  9. k8s核心组件详细介绍教程(配超详细实例演示)

    本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程 本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来 k8s核心组件介绍 1 ...

最新文章

  1. elastaticsearch 5.1.2 x-pack 设置权限访问
  2. SQL中Group By的使用,以及一些特殊使用方法
  3. Linux就业技术指导(一):简历撰写及面试筹备要领
  4. linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!
  5. DjangoForm组件初识
  6. 【计算机组成原理】课本总览
  7. 安装ipython(一分钟读懂)
  8. Scala的sealed关键字
  9. 邮件策略在域树中的实战应用:Exchange2003系列之十
  10. linux实训4文件系统管理,实训项目4 文件系统管理.docx
  11. servlet笔试题java,Java推荐!Servlet面试题和答案汇集
  12. iOS 开发者常用的75 个工具
  13. 2020-2022 抗疫营销案例合集(共17份)
  14. Python 生成微信头图
  15. linux安装时mbr转gpt分区表,免重装系统 手把手教你MBR转GPT分区表
  16. SwiftUI 如何同时处理2个手势SimultaneousGesture(教程含代码)
  17. 最大m子段和总结与例题 51nod1052 HDU1024
  18. fsck.ext3:unable to resolve 'LABLE=/home'
  19. VS中进行C#编码时智能提示由英文切换为中文
  20. 测试——水杯的测试用例

热门文章

  1. 汇编调用c语言函数 call printf,如何在汇编调用c语言函数?
  2. Kali Linux又增加一个顶级域名kali.download
  3. Xamarin Essentials教程地理定位Geolocation
  4. php 生成等比例缩略图,PHP等比例生成缩略图
  5. python3扫雷代码_GitHub - pantaduce/minesweeper: Python代码编写的扫雷游戏
  6. python 调用 tensorflow.dll_解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题...
  7. 手把手教你EMD算法原理与Python实现(更新)
  8. 大型神经网络可能初具意识:OpenAI首席科学家引争议,众大佬吵成一团
  9. 曹原获奖了,不是他终于有资格获奖,是奖终于有机会颁给他
  10. 跳水比赛背后的隐形教练现身了!百度智能云还完成了历史性的大升级