WINCE物理和虚拟地址的问题

 

在MAP.A中地址映射表转换物理地址到虚拟地址

 EXPORT      OEMAddressTable[DATA]

 ; LTORG

     AREA OEMAddressTable, DATA, READONLY

;OEMAddressTable

    ;;;-------------------------------------------------------------

    ;;; Virt Addr   Phys Addr   MB

    ;;;-------------------------------------------------------------

    DCD 0x80000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0

    DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1

    DCD 0x84000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2

    DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3

    DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4

    DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5

    DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0

    DCD 0x90800000, 0x48000000, 1 ; Memory control register

    DCD 0x90900000, 0x49000000, 1 ; USB Host register

    DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register

    DCD 0x90B00000, 0x4B000000, 1 ; DMA control register

    DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register

    DCD 0x90D00000, 0x4D000000, 1 ; LCD control register

    DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register

    DCD 0x91000000, 0x50000000, 1 ; UART control register

    DCD 0x91100000, 0x51000000, 1 ; PWM timer register

    DCD 0x91200000, 0x52000000, 1 ; USB device register

    DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register

    DCD 0x91400000, 0x54000000, 1 ; IIC control register

    DCD 0x91500000, 0x55000000, 1 ; IIS control register

    DCD 0x91600000, 0x56000000, 1 ; I/O Port register

    DCD 0x91700000, 0x57000000, 1 ; RTC control register

    DCD 0x91800000, 0x58000000, 1 ; A/D convert register

    DCD 0x91900000, 0x59000000, 1 ; SPI register

    DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register

    DCD 0x00000000, 0x00000000, 0 ; End of Table (MB MUST BE ZERO!)

     END

     针对一个ARM的处理器,它可以访问的物理空间是4GB。在WinCE中,ARM中的4GB物理地址空间将被映射为512MB的虚拟内存空间。OEMAddressTable就是一个4GB物理地址空间到WinCE Kernel中的512MB虚拟地址空间的映射表。上面的代码可以明显的看出确实将物理地址压缩在了512M以0X80000000为首地址的空间了。

  在BSP中,会定义OEMAddressTable来描述系统中可访问的物理空间及对应的虚拟地址空间,还有大小。这个表会在WinCE系统开始启动的时候传给MMU,具体到BSP中应该是在OAL中的startup.s中,OEMAddressTable的

起始地址会被放到r0寄存器中,然后就跳转到KernelStart里面,KernelStart会用OEMAddressTable完成MMU

得初始化。当WinCE启动以后,就只能访问虚拟地址空间了。

  但是,我在BSP中的S2440.H中看到的地址却和上面的物理地址不一样,比如:

     #define PWM_BASE      0xB1100000 // 0x51000000

 而在MAP.A:

    DCD 0x91100000, 0x51000000, 1 ; PWM timer register

 一个是 0xB1100000 ,而在MAP.A中却是0x91100000,探究两者地址的规律发现,所有S2440.H的虚拟地址在MAP.A的虚拟地址基础上加了0X20000000。这个偏移量恰好是静态映射虚拟地址有缓存和无缓存的偏移良,MMU是靠MAP.A中的OEMAddressTable对地址映射进行初始化的,

 OEMAddressTable介绍

     一般在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中要访问相关硬件的时候,查查这张表,然后通过虚拟

地址就可以访问了。如果没有定义,自己添加一个物理地址到虚拟地址的映射就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值