加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

WINCE 物理和虚拟地址的问题

发布时间:2020-12-15 06:59:08 所属栏目:百科 来源:网络整理
导读:WINCE ? 物理和虚拟地址的问题 在 MAP.A ?中地址映射表转换物理地址到虚拟地址 ? ? EXPORT????? OEMAddressTable[DATA] ? ? ; LTORG ???? AREA OEMAddressTable,DATA,READONLY ;OEMAddressTable ??? ;;;---------------------------------------------------

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读