一般在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中要访问相关硬件的时候,查查这张表,然后通过虚拟地址就可以访问了。如果没有定义,自己添加一个物理地址到虚拟地址的映射就好了。
![]()
如果喜欢oemaddresstable介绍 - wince请收藏或告诉您的好朋友.
阅读(135) | 评论(0) | 转发(0) |