2.2 Hello China在PC上的启动
2.2.1 PC启动过程概述
个人计算机(PC)一旦接通电源,设计的电路会触发CPU的reset引脚,从而导致CPU复位,并进入初始化过程。IA32构架的CPU中,CPU复位后,会根据CS寄存器和EIP寄存器的值跳转到地址空间的对应位置,执行PC系统的初始化指令。在IA32构架的CPU中,复位完成之后,各寄存器的初始值如表2-1所示。
表2-1 Intel CPU初始化后的寄存器值
可以看出,在复位后,CR0寄存器的值是0x60000010,这样的取值使得CPU处于实模式下(禁止分页机制、禁止Cache和直接写内存),CPU的寻址范围就被局限在1MB以内,而且对于内存的寻址在实模式下,也是按照CS左移四位,加上IP偏移的方式来寻址指令的。按照表2-1中CS和EIP的值,可以根据这个算法,计算出CPU第一条执行的指令的地址是0xFFFF0。因此,在PC系统中,应该把ROM系统固化在这个位置上,并把第一条指令放置在0xFFFF0处(实际上,IA32 CPU在复位之后,第一条执行的指令位置不是通过CS偏移加IP的方式计算出的,但得出的结果与这样计算获取的结果一致,因此在此不作实际算法的详细描述)。
在PC系统中,CPU复位之后,跳转到0xFFFF0处开始执行。一般情况下,该指令是一条跳转指令,跳转到一段完成硬件初始化的代码处。这段代码完成PC所有外围硬件系统的初始化,包括PCI总线的初始化、输入/输出设备的初始化等。初始化完成之后,会进入操作系统的加载过程。
在2.1节中,我们讲述了常见的嵌入式系统启动方式,有一种启动方式,操作系统是从外部存储设备(比如硬盘等)中加载的。实际上,PC就是这种系统的典型例子,也可以把PC视为一个高度标准化的嵌入式系统。一旦硬件初始化完成,引导程序会根据BIOS里面的配置,按照优先级,依次搜索可用的启动设备,比如硬盘、软盘、CD-ROM等。一旦找到一个可用的启动设备,则BIOS尝试把启动设备的第一个扇区读入内存(读入内存的位置为0x0000:0x07C0),然后判断该扇区是否是启动扇区(通过判断扇区末尾的标志字),若是,则跳转到启动扇区的第一条指令处开始执行。到此为止,PC的控制权完全从BIOS转移到了操作系统。若不是,则继续检查剩余的可用引导设备。
引导扇区的实现会因操作系统的不同而有所不同。一般情况下,一个引导扇区的大小是512字节,操作系统的初始化操作不可能放在这么少的代码段中完成。因此,引导扇区的主要工作是进一步从存储系统上加载其他的操作系统模块,其他的操作系统模块还有可能进一步加载更大的操作系统核心,再进入操作系统初始化过程。在操作系统初始化过程中,会根据硬件情况及用户的配置初始化硬件,并加载特定硬件的驱动程序。