x86架构系统启动过程

x86结构下操作系统启动:
计算机加电后,代码段寄存器CS=0xF000h,指令指针寄存器EIP=FFF0h,在CS寄存器中隐含的一个基址BASE=FFFF0000h,80386中实际地址是BASE+EIP=FFFF0000h+0000FFF0h=fffffff0h(在8086中最初执行的地址是PC=16×CS+IP,其实在GDB下调试ffffffff0h地址下的命令和ffff0地址处的命令相同,可能这就是8086架构的兼容),这是BIOS的EPROM所在地(只读),从该地址中读取第一条指令,一般为长跳转指令,跳转到真正的BIOS中去执行即跳转到可以被访问的1M的内存空间中(在实模式下只能访问1M空间)。在实模式下寻址为PC=16×CS+IP。BIOS先做初始化工作(初始化底层硬件),然后加载存储设备(硬盘,光盘,优盘)上的第一个扇区(主引导扇区)的512字节到内存的0x7c00,cpu执行0x7c00的指令开始执行,也就是bootloader。

bootloader要做的事情是:(1)使能保护模式(protection mode)&段机制(segment-level protection等初始化)。(2)从硬盘上读取kernel in ELF格式的ucore kernel(跟在MBR–引导扇区后面的扇区),并放到内存中固定的位置,(3)跳转到ucore OS的入口点(entry point)执行,控制权交给ucore OS

即执行的第一条指令也在这里:
(0) [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0
跳转到真正BIOS程序的入口地址

这里做很精妙,因为intel考虑到兼容性问题设置了cpu加电后cs:ip=0xf000:0xfff0: 如果是i8086那么该跳转指令将在16位cpu可寻址最大空间1MB(基本内存)的最后16Byte,如果是i80386则将在32位cpu可寻址最大空间4GB的最后16Byte。

注:通过cs:ip可以发现第一条指令是在0xf000:0xfff0 执行的. 如果只读过大学那些涉及皮毛的书你肯定会认为其物理地址就是0xffff0 (0xf000<<4+0xfff0)。但这样的认识仅仅是针对i8086 ,真正的x86 架构即i80386 之后是这样的:cpu刚刚设置cs:0xf000的时候其实并不是像课本上说的那样在实模式下。此时的物理地址需要根据cs中的隐藏寄存器dl=0x0000ffff, dh=0xff009bff中去查。这个其实就是段描述符(至少在保护模式下是,这里也暂时这样称呼吧) dh的最高8位和最低8位以及dl的高16位组成了32位段基址:0xffff0000 再加上ip:0xfff0 那么物理地址就是0xfffffff0 正好是4GB空间的最后16Byte。

执行第一条指令后ljmp f000:e05b:程序跳转到0xfe05b处,正式执行BIOS,然后BIOS中经过一系列设置,包括:基本的输入输出的程序,系统设置信息,开机后自检程序,系统自启动程序等。
然后,BIOS将加载程序(Bootloader)从磁盘的引导扇区(512字节)加载到内存(CS=0:EIP=0x7c00)处。最后Bootloader将操作系统的代码和数据从磁盘中加载到内存中。跳转到操作系统的起始地址。

磁盘的引导扇区(512字节):主引导记录MBR格式包括:启动代码(446字节)作用—检查分区表正确性,加载并跳转到磁盘上的引导程序;硬盘分区表(64字节)作用:描述分区状态和位置,每个分区描述信息占据16字节;结束标志(2字节)–55AA(主引导记录的有效标志)
分区引导扇区(PBR或DBR):通过主引导记录跳转到分区引导扇区包括:跳转代码—跳转到启动代码;文件卷头—-文件系统描述信息;启动代码—跳转到加载程序(Bootloader);结束标志(55AA)

注:通常,我们将包含MBR引导代码的扇区称为主引导扇区。因这一扇区中,引导代码占有绝大部分的空间,故而将习惯将该扇区称为MBR扇区(简称MBR)。由于这一扇区承担有不同于磁盘上其他普通存储空间的特殊管理职能,作为管理整个磁盘空间的一个特殊空间,它不属于磁盘上的任何分区,因而分区空间内的格式化命令不能清除主引导记录的任何信息。硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。但我们可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具Norton8.0中的DISKEDIT.EXE来读取。PBR是各个分区自己的引导记录,又称分区引导记录,它是由FORMAT高级格式化命令写在各个分区开始处第一个扇区(比如说:主分区C:从1磁头0柱面1扇区=逻辑1扇区=绝对63扇区)开始,
我们知道硬盘MBR负责总管硬盘分区,只有分区工具才能对它进行读写;而PBR则负责管理某个具体的分区,它是用操作系统的高级格式化命令来写入硬盘的。在系统启动时,最先读取的硬盘信息是MBR,然后由MBR内的主引导程序读出PBR,最后才由PBR内的DOS引导代码读取操作系统的引导程序,其中任何一个环节出了问题,操作系统都无法正常启动成功,如果是MBR部分出了问题,即使只是”55AA”标志字丢失或被改为其他值,通常都会出现”无效分区表”、逻辑盘丢失、启动死机等现象;而如果是PBR部分出了问题,通常会出现”未格式化的分区”的错误提示。

你可能感兴趣的:(操作系统)