Nboot和Eboot中的虚拟地址与物理地址的关系

大家在看Nboot与Eboot的源程序时,会发现里面有两种地址:虚拟地址与物理地址,虚拟地址是你在程序中用的地址,而物理地址则是RAM中的实际地址。在Bootloader里,可以直接使用物理地址,但当WinCE启动之后,则只能使用虚拟地址了。

 

在Bootloader中,一般通过一个宏定义函数来互相转换,如:

 

 

其中的参数定义为:(基于S3C2410A的例子)

 

_RAM_STARTADDRESS为RAM的实际物理起始地址。

VA_BASE是定义在OEMAddressTable中的。这个OEMAddressTable,在WinCE4.2中,定义在map.a(位于$(_WINCEROOT)/PLATFORM/USERPLATFORM/KERNEL/HAL/ARM/)这个文件中,在WinCE5.0则定义于oemaddrtab_cfg.inc(位于$(_WINCEROOT)/PLATFORM/USERPLATFORM/SRC/INC/)

 

如:

                    虚拟地址                物理地址               大小

 

OEMAddressTable:

dd             0x8C000000          0x30000000        64M

dd             0                            0                          0

 

有两点注意:

  1. S3C2410的RAM被定义到从0x30000000开始的地址;
  2. 虚拟地址不是随便定义的,WinCE中有规定,必须在0x80000000 - 0x9FFFFFFF。实际上WinCE创建了两套虚拟地址空间,一个是0x80000000 - 0x9FFFFFFF,是Cache Enabled。另一个是0xA0000000---0xBFFFFFFF,是Cache Disabled。
          如果我们访问的这个空间只是一段内存空间(比如SDRAM),那么就可以用Cache Enabled的空间来访问,这样存取数据的速度会比较快,因为数据被保存在Cache中。

    如果我们访问的这个空间是一个外设的地址,那么我们就要使用Cached Disabled的空间来访问,这样才能使CPU与外设同步。

 

 

下面介绍S3C2410芯片的的内存控制器物理地址分配:

 

来看一个g_oalAddressTable的例子:

 

 

按照S3C2410芯片内置的内存控制器的设计,从0x48000000到0x5FFFFFFF范围内的系统物理地址空间被命名为SFR(Special Function Register)的片内外设寄存器(包括控制寄存器、状态寄存器、数据缓冲区等),由上表可以看出,有USB、LCD等外设。

可供CPU芯片外接的外设控制器或者存储设备使用的物理地址范围是0x00000000到0x3FFFFFFF这1GB的地址空间。这1GB共被分为8个Bank,每个Bank享有128MB的物理地址空间。其中只有Bank6和Bank7可以支持RAM存储类型。

物理地址0x30000000到0x3FFFFFFF这一块长达256MB的区域被物理RAM使用,这实际上是用满了S3C2410内存控制器的Bank6和Bank7。由上表可以看出,尽管物理地址是连续的,但是虚拟地址可以不连续,即分为了64MB和192MB的两块。

物理地址0x00000000到0x05FFFFFFF区域被Nor Flash存储占用,其总容量为96MB。

存储控制器的Bank2被一块32MB的存储类型PC卡外设占据。

存储控制器的Bank3被外置的以太网控制器芯片占用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值