wince7的内存映射及扩展

本文详细介绍了WinCE操作系统中32位环境下虚拟内存的管理方式,包括4GB地址空间的划分、静态映射与动态映射的区别及应用场景,并具体分析了ZC702开发板上1GB DDR内存的分配和使用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

wince虚拟内存相关知识:

        wince7是32位的操作系统,其虚拟寻址能力可达4GB(2^32=4GB)。这4GB地址空间被分为2个2GB的区域,其中低2GB地址空间0x00000000~0x7FFFFFFF是用户虚拟空间,供应用程序使用,如在应用程序中用malloc申请的内存就是在这个区域。高2GB地址空间0x80000000~0xFFFFFFFF是操作系统的虚拟内核空间,供wince操作系统本身使用。0x80000000~0x9FFFFFFF(512M)虚拟地址空间是用来静态映射物理地址的,也就是说wince会把512MB大小的物理地址1:1的映射到这段虚拟内存上。wince7最大支持的内存可达3GB,而wince6之前的只能支持512MB.

静态映射:

        顾名思义静态映射就是指虚拟地址和物理地址是固定的一个映射关系,静态映射又分为带缓存映射不带缓存映射。0x80000000~0x9FFFFFFF地址属于带缓存映射,0xA0000000~0xBFFFFFFF地址属于不带缓存的映射。在zc702的wince7 BSP源码Addrtab_cfg.inc中有一个g_oalAddressTable,如下所示:

        其中每行的第一个地址是虚拟地址,第二个是映射的物理起始地址,第三个值是映射空间的大小(单位MB)。zc702开发板上的DDR内存达1GB(4个256MB,8bit的DDR芯片组成),物理地址范围为0x00000000~0x3FFFFFFF。第一行参数就表示将0x80000000开始的256MB虚拟地址空间映射到起始物理地址0x00000000的256MB物理内存中(剩下没映射的物理内存为1GB-256MB=768MB)。同理接下来的4行参数表将对应的虚拟空间映射到对应的物理地址空间中,但这里的物理地址空间对应的是arm中的寄存器组的起始地址。

        在映射完0x80000000~0x9FFFFFFF地址空间(带缓存)后,又会从0xA0000000~0xBFFFFFFF将刚才的物理地址空间重新映射一遍(不带缓存)。在Addrtab_cfg.inc中有如下描述

动态映射:

     动态映射通过MmMapIoSpace()函数来实现。该函数接受要映射的物理地址和要映射内存的大小。然后在虚拟内核空间中开辟一块同样大小的内存,并将该虚拟内存与物理地址所指向的物理空间映射起来。最后该函数返回虚拟内存的起始地址。向这个虚拟内存写入数据,系统就会将同样的数据写入对应实际的物理地址空间。使用完后,可通过MmUnMapIoSpace函数来解除映射。

静态映射和动态映射的使用地方:

      动态映射常用于wince驱动程序,在对arm的寄存器操作之前,先将寄存器组首地址通过MmMapIoSpace函数映射到内核空间,再通过对虚拟内存的操作来实现对物理寄存器的操作。MmMapIoSpace这个函数需要等到wince7系统运行起来后才能使用,如在OEMInit函数中应该是无法使用的。所以如果在OEMInit或者Eboot中要访问寄存器,那么此时就应该使用OALPAtoUA()这个函数进行静态映射,并且应该使用非缓存段(0xA0000000~0xBFFFFFFF)。当然,使用虚拟地址的前提是系统开启了MMU,如果没有开启MMU那么就该直接使用物理地址访问。如我的ZC702上wince7的Eboot没有开启MMU,所以在Eboot中可直接使用物理地址。

上面所说的静态映射动态映射其实是对于arm寄存器来说的。现在来说一下zc702上1GB DDR内存的使用情况。

        在g_oalAddressTable中可知,1GB内存的起始256MB空间被静态映射到0x80000000~0x8FFFFFFF虚拟内存上。那么这段虚拟内存用来做什么呢?在wince7的config.bib文件中有如下描述:

        这里是向系统指明这256MB虚拟空间各段的作用(如地址为0x8020000~0x3FFFFFFF的内存空间就是用来存放NK的)。剩下的768MB DDR内存中物理地址为0x30000000~0x3FFFFFFF的256MB空间是作为LCD显存来使用的。这样还剩下512MB的DDR内存在哪里使用呢?在WINCE700\platform\ZYNQ7000\SRC\OAL\OALLIB\init.c文件中有如下一个数组,

        数组中第一行和第二行的首个参数就是第二片和第三片DDR芯片的物理起始地址,每个DDR芯片256MB。将这个数组通过变量g_pOemGlobal传给内核,内核就能使用这512MB的DDR内存。

        在zc702的wince7系统上打开System Properties对话框,可以看到此时wince系统的可用Memory为748132KB约为730MB。我们来计算一下这个内存大小是从哪来的?很明显其中的512MB是来自第二片和第三片DDR。在config.bib文件中可知第一片DDR的0x0C000000(192MB)大小的空间是作为RAM的。从config.bib我们还可知道第一片DDR的0x03E00000(62MB)大小的空间是用来存放NK的。但是编译出来的NK实际只有30MB。这样62MB的空间实际就用了30MB,还空出32MB。这样512MB+192MB+32MB=736MB,与730MB只相差6MB。之所以有这6MB的误差是因为这里是用MB为单位计算,其次NK.bin在内存中解压后也会比30MB大一些。

        弄清wince中730MB可用内存的来源后,我们再看一下System Properties对话框中的Memory菜单。可以很明显看到这730MB内存被分为Storage MemoryProgram Memory。Storage Memory是内存中用来存放文件等静态数据的空间,如系统桌面上的文件就是存放在这里的。而Program Memory就是应用程序运行时所用的空间。这两个内存的大小可通过移动滑块来动态更改,也可通过在config.bib文件中加入FSRAMPERCENT参数来设置,但在实践中发现Storage Memory最大只能设置到131004KB。

        最后关于扩展wince内存可参看如下链接中的描述:

http://e2e.ti.com/support/embedded/wince/f/353/t/134741

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值