简介
我会在这里面记录,阅读这本书的一些个人理解。
1.从开机加电到执行
1.1 启动BIOS,准备实模式下的中断向量表和中断服务程序
1.1.1 BIOS的启动原理
在cpu加电后,会强制把cs指向0XF000,ip的值置为0XFFF0,这样CS:ip就指向0XFFFF0这个地址位置。
BIOS程序的入口地址恰恰就是0xFFFF0!也就是说,BIOS程序的第一条指令就设计在这个位置。
1.1.2 BIOS在内存中加载中断向量表和中断服务程序
现在CS:IP已经指向0xFFFF0这个位置了,这意味着BIOS开始启动了。随着BIOS程序的执行,屏幕上会显示显卡的信息、内存的信息……说明BIOS程序在检测显卡、内存……这期间,有一项对启动(boot)操作系统至关重要的工作,那就是BIOS在内存中建立中断向量表和中断服务程序。
BIOS检查硬件,然后建立中断向量表和中断服务程序。
1.2 加载操作系统内核程序并为保护模式做准备
从现在开始,就要执行真正的boot操作了,即把软盘中的操作系统程序加载至内存。对于Linux0.11操作系统而言,
计算机将分三批逐次加载操作系统的内核代码。第一批由BIOS中断int0x19把第一扇区bootsect的内容加载到内存;
第二批、第三批在bootsect的指挥下,分别把其后的4个扇区和随后的240个扇区的内容加载至内存。
1.2.1 加载第一部分内核代码——引导程序(bootsect)
经过执行一系列BIOS代码之后,计算机完成了自检等操作,计算机硬件体系结构的设计与BIOS联手操作,让CPU接收到一个int 0x19中断。CPU接收到这个中断后,在中断向量表中找到int 0x19中断向量。
接下来,中断向量把CPU指向0x0E6F2,这个位置就是int 0x19相对应的中断服务程序的入口地址。这个中断服务程序的作用就是把软盘第一扇区中的程序(512 B)加载到内存中的指定位置。
将软驱0号磁头对应盘面的0磁道1扇区的内容复制至内存0x07C00处
对BIOS而言,“约定”接到启动操作系统的命令,“定位识别”只从启动扇区把代码加载到0x07C00 (BOOTSEG)这个位置(参见Seabios 0.6.0/Boot.c文件中的boot_disk函数)。至于这个扇区中是否是启动程序、是什么操作系统,则不闻不问、一视同仁。如果不是启动代码,只会提示错误,其余是用户的责任,与BIOS无关。