当前位置:首页 > 编程开发

存储与地址映射技术

webgou16年前 (2011-04-28)编程开发229
wince存储与地址映射技术
      Windows CE采用了四层内存管理结构,从下到上依次为:物理内存,虚拟内存,逻辑内存和C/C++运行时库.其中物理内存包括:RAM(为OS和程序提供运行和缓冲空间),ROM(存储程序,包括OS和一些文件),Flash(可擦写).CE支持最大物理内存为512M.
  所有进程共享4G的虚拟存储空间,它是通过以页为单位管理的,不同处理器支持页大小不同(ARM支持1K,4K,64K,1M;X86支持4K与4M).虚拟内存的申请分成保留和提交两个过程(reserve and commit).虚拟内存要求硬件上具有MMU的支持,MMU负责把虚拟地址映射到物理地址,并提供内存保护.CE把4G的虚拟内存分成两部分:低2G为用户空间,由应用程序使用;高2G为内核空间,由OS使用.
  所谓逻辑内存分成堆(64K)和栈(60K).而C/C++运行时库提供了一系列内存管理函数,比如malloc,new,delete等等.
  在PB的帮助中指出WINCE有两种地址:物理地址和虚拟地址.在不同架构的CPU下,概念有所区别.MIPS和SHx处理器,内核操作1G的存储(512M缓存,512M非缓存);而X86和ARM在OEMAddressTable中划分物理存储.相应的地址映射方法也分成两种:MIPS和SHx处理器,不采用MMU,直接在CPU和内核里定义;X86和ARM在OEMAddressTable中定义映射关系或者是OS启动后调用CreateStaticMapping和NKCreateStaticMapping来实现从虚拟地址到物理地址的映射.
  另一种分类是映射虚拟地址的形式可以分成静态虚拟地址映射和动态虚拟地址映射.所谓静态,就是在OEMAddressTable中定义映射关系或者是OS启动后调用CreateStaticMapping和NKCreateStaticMapping来实现从虚拟地址到物理地址的映射;动态则是通过VirtualAlloc和VirtualCopy(或者调用MmmapIoSpace函数).这两种映射虚拟地址的形式区别在于静态虚拟地址只能由内核使用,用于ISR访问外设存储.而动态虚拟地址可以在应用程序里访问物理地址(比如在驱动中操作寄存器).
    在X86和ARM体系的CPU里,有一个数据结构对于地址映射技术尤其重要:OEMAddressTable.这个数组定义了外设从4G的虚拟地址到512M物理地址的映射关系.它位于public\common\oak\csp\x86\oal目录下的oeminit.asm中,格式为 Virtual Address, Physical Address, Size
     在X86下大小必须是4M的倍数,ARM下为1M的倍数.内核建立了两个范围的虚拟地址:从0x80000000到0x9FFFFFFF是带缓存的物理地址映射,而0xA0000000 到 0xBFFFFFFF 是不带缓存的物理地址映射.驱动访问外设时,应该用不带缓存段的虚拟地址.  要注意的一点是,如果改动了OEMAddressTable,相应要改动config.bib.
 
1.如果是在bootloader中访问设备寄存器,可以直接操作物理地址。
2.wince启动后,硬件上ARM和X86体系的处理器启动了MMU,操作系统只能访问到虚拟地址,不能直接操作物理内存了。但是如果是X86的CPU,由于它的外设I/O端口和存储器空间分开编址,可以直接嵌入汇编或者使用宏read_port_xxx,write_port_xxx来读写设备寄存器的物理地址。
3.wince软件结构里对应MMU的是一个名为OEMAddressTable的数据结构(源文件oeminit.asm中),其中建立了物理地址和虚拟地址的静态映射关系,也可以在其中改动系统所能识别物理内存的大小,以支持大内存。
4.我们也可以在wince启动后调用CreateStaticMapping和NKCreateStaticMapping来实现OEMAddressTable中的这种物理地址和虚拟地址的静态映射关系。
5.建立了静态映射关系的虚拟地址只能由内核模式下的程序来操作,例如 ISR。除非你在定制系统时,选择了full kernal mode,使所有程序都运行在完全内核模式下,这将导致系统不稳定。
6.如果要在驱动程序中访问设备寄存器,必须建立动态虚拟地址映射,可以调用MmmapIoSpace函数来实现,或者通过VirtualAlloc和VirtualCopy函数来实现。其实MmmapIoSpace内部就调用了后者。
7.在驱动中访问虚拟地址时,必须是非缓存段(位于0xA0000000 到 0xBFFFFFFF )。
8.使用VirtualCopy函数映射物理地址时,其lpvSrc参数必须右移8位,且相应的fdwProtect参数必须带page_physical。
9.如果是ARM体系的处理器,访问挂在系统总线上的设备寄存器前,必须先把总线地址转化成CPU的地址,通过HalTranslateBusAddress实现两种物理地址的变换,然后再调用MmmapIoSpace函数作虚实地址的转换。
也可以使用 TransBusAddrToVirtual ()直接把总线上的地址转化成系统的虚拟地址。 在一般的应用程序中访问 I/O 是访问它的缓存段虚拟地址,而驱动中必须访问无缓存段虚拟地址。简单来说无缓存段虚拟地址 = 缓存段虚拟地址 +0x20000000 。 
      
         总结起来,如果是 wince 内核(如HAL)访问外部 I/O ,只需要在 OEMAddressTable 中定义物理地址到虚拟地址间的映射关系就可以了;如果是应用程序或者驱动要访问 I/O ,要做的工作包括: 1 。在 CPU 物理地址和虚拟地址间做一个动态映射, 2 。对虚拟地址进行操作。
              wince5.0下可以使用CreateBusAccessHandle(总线注册表路径)+BusTransBusAddrToVirtual来实现总线物理地址到系统虚拟地址的直接变换。

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=459

标签: wince
分享给朋友:

“存储与地址映射技术” 的相关文章

Mac Application GDB Usage

一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(*、?、[、])在内。&…

三本优秀的Python教程

 因为突然就对PY感兴趣了~囧~…所以决定找教程学习下(话说到现在还没完整学完一门语言呢…T_T)。相对于其他的程序语言,Python的教程显得单薄。这里推荐三份流传广泛的Python教程,如果你正准备找教程学py,希望本文会对你有用。...…

Android电话功能各部分深入探讨

Android手机操作系统是一款基于Linux平台的开源系统。开发人员可以根据不同的需求对其进行修改等操作。在这系统中有很多比较重要的功能值得我们去研究。比如Android电话功能就是其中一个基础知识点。第一部分 Android电话功能概述Android的Radio Interface Layer…

C/C++语言void及void指针深层探索

本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。…

How do I update Ubuntu Linux softwares?

Q. I have latest version of Ubuntu Linux. How do I update Ubuntu Linux for security and application fix or upgrades? A. Ubuntu Linux can be upgraded u…

软件会议思考

很多时候,也有很多想法,但过完之后也就没有.刚看到一篇关于危险职业的论断,提出收入大与出路窄很有道理. 今天,开会的主要主题有两个: 1.应对售后,编写提供给销售人员能定位程序异常的工具 2.后装车机市场,提高开发速度,破解协议任务的分解 关于工具,主要功能: 1.取得日志, 2.获取当前软件信…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。