摘要: 首先要理解 windows CE 下的地址映射机制。 wince有两种地址:物理地址和虚拟地址.不同架构的 CPU 硬件上的区别导致地址映射也不同。MIPS和SH x 处理器,不采用MMU,直接在CPU和内核里定义 1G 的物理地址;而X86和ARM带有 MMU 单元,在 OEMAddressTable 中定义物理地址到虚拟地址间的映射关系或者是OS启动后调用 CreateStaticMapping 和 NKCreateStaticMapping 来实现从虚拟地址到物理地址的静态映射.经过静态映射的地址,可以由操作系统内核用于 ISR 访问设备。如果我们要在应用程序中访问外设,必须在物理地址和 阅读全文
posted @ 2010-04-29 16:20 gmh 阅读(1020) 评论(0) 推荐(0) 编辑
摘要: 先说VirtualAlloc 和VirtualCopy VirtualAlloc 首先会从我们的虚拟地址空间中申请(或者说预留)一块虚拟空间,准备接下来要用它。注意此时,可用的物理内存并没有减少,只是虚拟地址少了一块可用的区域。真正把这块之前reserved的虚拟空间映射到物理的内存区域就是由VirtualCopy来干的,此时,MMU的页表就会增加一个entry,来表示物理--虚拟的映射关系。再说动态虚拟内存映射和静态虚拟内存映射 OEMaddressTable只是建立了一个一级的静态虚拟--物理的映射关系,一般给kernel(NK.EXE)通过直接访问的形式来用(OALPAtoVA); Mm 阅读全文
posted @ 2010-04-29 10:52 gmh 阅读(814) 评论(0) 推荐(1) 编辑
摘要: 1.VirtualAlloc用来在进程的虚拟地址空间中保留(reserve)或者提交(commit)页。在保留时以64KB为粒度,即保留空间以64K为单位。而提交虚拟地址时,则以页(典型大小为4KB)为单位。2.VirtualCopy用来绑定一块物理内存到当前进程虚拟地址空间。参数里的lpvSrc既可以是内核段的虚拟地址也可以是物理地址(用page_physical来标记)。同时要注意lpvSrc的右移与否。 PAGE_PHYSICAL这个参数决定了要右移八位(除以256),不过还有一点就是使用了PAGE_PHYSICAL之后就不要使用VirtualFree 了因为,使用了也无济于事3.使用V 阅读全文
posted @ 2010-04-29 10:39 gmh 阅读(674) 评论(0) 推荐(0) 编辑
摘要: 1.如果是在bootloader中打开MMU之前,程序访问设备寄存器,可以直接操作物理地址,无需虚实映射。2.wince启动后,硬件上ARM和X86体系的处理器启动了MMU,操作系统只能访问到虚拟地址,不能直接操作物理内存了。但是如果是X86的CPU,由于它的外设I/O端口和存储器空间分开编址,可以直接嵌入汇编或者使用宏read_port_xxx,write_port_xxx来读写设备寄存器的物理地址。3.wince软件结构里对应MMU的是一个名为OEMAddressTable的数据结构(源文件oeminit.asm中),其中建立了物理地址和虚拟地址的静态映射关系,也可以在其中改动系统所能识别 阅读全文
posted @ 2010-04-29 10:37 gmh 阅读(338) 评论(0) 推荐(0) 编辑