计算机的启动流程
当我们按下开机键时,计算机会执行以下步骤进行启动:
CPU
进行初始化,并进入实模式CPU
根据两个寄存器CS
和IP
到内存的0xffff0
处读取BIOS
程序并执行BIOS
提供一些最基本的I/O
、硬件检查等的功能,它会到磁盘中引导程序,放到内存的0x7c00
处- 到
0x7c00
执行引导程序,读取加载程序,然后读取操作系统文件 - 执行加载程序,移动操作系统文件的位置,并进入保护模式
- 操作系统执行
上面有一些需要解释的概念。
实模式
最开始的CPU
只有一个模式(实模式),后来又出现了保护模式,为了区分,就将最开始的这个模式称为实模式。
为什么叫实模式?
该模式下,程序员在程序中写的地址就是真实的物理地址,地址不会经过变换,这也可能造成安全问题。
为什么存在实模式?
实模式是古老的CPU
的模式,现在的计算机已经不需要实模式了,但是为了向前兼容,实模式也就保存下来了。
实模式下的内存寻址方式
该模式下的寻址方式是 使用段基址与偏移地址求出真实地址 然后去取数据。
这种方式是为了处理8086
处理器的一个问题而设计的:8086
处理器有20
根地址线,可寻址1MB
内存,但其寄存器是16
位的,只能存放64KB
内存的地址。
为了解决这个问题,人们将1MB
内存分成16
个相同大小的段,每段64KB
,然后用2
个寄存器来记录地址:
- 一个是段寄存器(
CS
),存放的是地址所在的那个段的编号 - 另一个是指针寄存器(
IP
),存放的是地址在段中的偏移量
通过这两个地址可以访问内存的任意位置。
公式:真实地址 = (CS)*16(左移4位)+ (IP)
限制
由于实模式下只能访问1MB
内存,因此BIOS
必须存放在内存0-1MB
范围内,准确地说,BIOS
所在的开始位置为0xffff0
。
BIOS执行
从0xffff0
开始执行BIOS:
- 进行硬件检查
- 从硬盘中读取主引导记录到内存的
0x7c00
处
读取过程的细节
BIOS
读取硬盘第一个扇区中的主引导记录(MBR
),MBR
共512B
,其中446B
的启动代码用于检查MBR
是否正确以及读取加载程序,另外的4*16B
存放4
个分区的信息,最后2B
表示结束标志0x55AA
。
启动程序执行
- 将自己移动到
0x90000
处 - 从硬盘中读取加载程序到内存的
0x90200
处 - 读取操作系统到
0x10000
加载程序执行
- 读取系统参数,如内存大小,放在内存的
0x90000
处(覆盖了启动程序),进行初始化 - 将操作系统文件从
0x10000
移动到0x00000
处开始 - 加载
IDT
和GDT
- CPU进入保护模式
- 运行操作系统
如何进入保护模式
将寄存器cr0
的最后一位置为1
,即进入保护模式
保护模式下的寻址方式
与实模式下不同,此时CS
称作选择子,根据CS
的值到GDT
表中查找段基址,然后用找到的段基址与IP
中的值求和,得到真实地址。