分类: LINUX
2015-01-29 11:15:49
说明:PowerPC 的启动不同于普通的CPU启动,由于其为了适应硬件系统的不同需求,设定了两类启动的地址跳转。而CPU的启动除了涉及到地址跳转的问题外,还牵扯启动源 的选择、硬件配置字的设定以及仿真器的配置等等相关一系列问题。在这系列博客中上述问题都会涉及到,本文重点描述PowerPC上电复位后的启动流程。其实要充分实在的理解PowerPC的启动过程,最可靠的方法就是将官方的芯片手册相关部分读懂,这也是本文最直接的参考资料。
参考资料:MPC8349EA PowerQUICC? II Pro Integrated Host Processor Family Reference Manual
下面我们就来讨论启动过程中PowerPC的状态。至于与操作系统相关联的部分要在以后说明,这里只说明上电复位后,最为基本和关键的流程。
CPU启动配置主要问题就是正确配置硬件配置字中地址位及操作系统相关的宏。
在硬件配置字中,涉及到启动相关的参数设置为:BMS/ROMLOC
BMS: 0 Boot memory space is 8 Mbytes at 0x0000_0000 to 0x007F_FFFF.
e300 core register MSR[IP] initial value is 0b0.The core, if enabled to boot, begins fetching boot code from address 0x0000_0100 and exceptions are vectored to the physical address of 0x000n_nnnn.
1 Boot memory space is 8 Mbytes at 0xFF80_0000 to 0xFFFF_FFFF.
e300 core register MSR[IP] initial value is 0b1.The core, if enabled to boot,begins
fetching boot code from address 0xFFF0_0100 and exceptions are vectored to the
physical address of 0xFFFn_nnnn.
说清楚了,就是CPU会设置8Mbytes的启动空间,启动地址可能是从0x0000_0000开始或者0xff80_0000。而取指令的地址也因空间不同而不同,第一种地址是从0x0000_0100开始,另外一种是从0xFFF0_0100开始。
ROMLOC: 本例选择110:Local Bus GPCM—16 bit rom
需要注意一个问题,就是BSM如果从0xFFF0_0100取指令的话,那么它的寻址空间是要受到限制的,因为32位地址总线只能到地址0xFFFF_FFFF。所以,为了解除这类限制,一般采用的方法是配置硬件配置字,让CPU从0x0000_0100取地址。
一般地,硬件启动会将bootrom存在FLASH中,系统上电后会从FLASH启动。可是FLASH的地址一般又不会在0x0000_0000开始,以 32M FLASH启动为例可以将启动空间设置为0xFE00_0000-0xFFFF_FFFF。所以必须加入适当的程序来改变这一过程。
解决这一问题涉及到两类重要的寄存器:窗口寄存器LBLAW(B)AR0,以及总线控制中的BR0 OR0。很多时候,我们将两者地址设置相同,实际这是两个概念。窗口寄存器是针对CPU来讲的,即虚地址。而总线控制寄存器是针对片选的实际设备,即实地址。说得再清楚点窗口寄存器是CPU用的地址(The local memory map refers to the 32-bit address space seen by the processor as it accesses memory and I/O space),而其实际选择在哪个设备CPU是不知道的,这时候需要对应总线控制寄存器告知他的具体位置。
CPU上电启动,与启动相关的各寄存器(LBLAWBAR0 LBLAWAR0 BR0 OR0)得到了相应的复位值:
l LBLAWBARO复位值与BMS对应,当BMS为0时,启动地址0x0000_0000;当BMS为1时,启动地址0XFF80_0000;
l LBLAWAR0复位值为0x8000_0016,即启动为8M bytes空间,并且该访问窗口使能。
l OR0复位值为0x0000_0FF7,即片选0的设备可在4G地址空间内自由跳转;
l BR0复位值为0x0000_0001,即片选0的设备基地址为0x0000_0000.
CPU上电启动后,首先通过窗口寄存器找到对应的启动位置,根据我们的设计最初的位置为0x0000_0000。这时候,这个虚地址实际上被映射到了片选0的FLASH设备上了。因为复位后,CPU认为片选0的设备起始地址为0x0000_0000,并且空间为4G。那么就一个32M的FLASH,怎么会提供4G存储空间呢?硬件上,一般是地址线的低位连接FLASH,所以实际上高位对FLASH的寻址是不起作用的。所以CPU寻址过程中,虽然是4G空间,不过其数据内容是以32M为单位循环的。
通过上面的过程,CPU就很自然地以0x0000_0100为取指令地址到FLASH空间(即将要被设置为0XFE00_0000-0XFFFF_FFFF的)去启动vxWorks操作系统。这是PowerPC芯片启动的第一步,也是最难理解的一步。只有充分明白这一过程,才能正确设置操作系统内的宏地址。其实掌握这个问题的关键有两个:一是正确理解硬件配置字的描述,这个不难;第二就是要对各寄存器的物理意义能够清楚地说明白,而不是简单地记住其复位值。