1.开启电源
2.启动自检
3.初始化所有寄存器,其中的CS:0xF000、IP:0xFFF0
4.如果存在异常,则将异常写入EAX中。
5.检测EAX的值是否正常。如果不为0,则发生错误。
6.CPU开始执行CS:IP处代码。
注意:在64位CPU环境下,平时的工作都是在保护模式下进行的。使用的都是虚拟地址来访问内存。由内存管理单元MMU负责做地址转换(虚拟地址->物理地址)。但在开机时,虚拟地址转换所需的页目录、页表等数据都尚未加载,所以MMU暂时无法使用。因此开机时使用的都是16位寄存器。在实地址模式下运行使用的是真实物理地址(段地址x16+偏移地址),最大寻址空间为1MB。0xF000:0xFFF0表示的物理地址:0xFFFF0。即cs左移4位。2的20次方最大1MB也就是0xFFFFF。而0xFFFF0指向的就是接近末端的位置。
7.刚开机时,内存中是没有数据的。因为内存中的数据都是动态写入的,关机就会消失。所以在开机后,主板BOIS就会将自己ROM中的数据映射到内存中。
8.CPU开始执行CS:IP(0xFFFF0)处指令。而这个地址处的指令是一个jmp XXXX的跳转指令,这是一种非常好的兼容写法,方便日后的扩展改动。这样CPU就不需要进行改动,无论主板怎么更新,CPU开机第一件事就是执行0xFFFF0处指令。
9.BOIS开始对计算机进行各种检测。而此时需要注意的是,整个CPU的执行过程都是单核的,也就是其他的核心都在摸鱼。只有等操作系统加载后,才会正真发挥多核作用。
10.当BOIS检测完计算机后,开始加载操作系统。
11.寻找第一块顺位启动盘。这个启动顺序可以在bois设置中找到。
12.加载主引导记录MBR。MBR保存在磁盘第0盘第0道第1扇区,大小为512字节。
下图使用的是WinHex对C盘进行查看。其中最末尾的“55 AA”是MBR的关键标识。
BOIS会将MBR加载到内存的0x7C00处。之所以是0x7C00,而不是别的地方。是因为沿用了Intel第一代个人电脑8088芯片的设计。此后为了保持兼容长久使用了0x7C00地址。
13.当MBR加载到内存的0x7C00后,CPU就开始正式执行操作系统指令了。
14.切换工作模式为保护模式。
15.加载页目录和页表,使MMU可以对虚拟地址进行转换。
下图为MMU工作原理
MMU其实就是一个骗子,每个进程都以为自己拥有独立的内存空间,但实际上都是MMU给出的假象。真实的物理地址是由MMU进行管理和分配的。假设每个进程的虚拟地址都是都是0-100,但对应的真实物理地址却是不同的。
16.创建多条线程开始启动系统,此时CPU的多核才开始发挥作用,进行协同工作。