WINCE物理和虚拟地址的问题

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 虚拟地址空间的映射表。上面的代码可以明显的看出确实将物理地址压缩在了512M0X80000000 为首地址的空间了。

    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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值