Chinaunix首页 | 论坛 | 博客
  • 博客访问: 569098
  • 博文数量: 1357
  • 博客积分: 3000
  • 博客等级: 中校
  • 技术积分: 14950
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-14 20:23
文章分类

全部博文(1357)

文章存档

2010年(1357)

我的朋友

分类:

2010-09-26 13:23:28

  一般在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) |
给主人留下些什么吧!~~