在此说明:刘超的Linux操作系统趣谈是比较重要的参考资料。本文大部分内容和所有图片均来自本专栏。背景知识在了解计算机在x86架构下的工作模式之前,计算机系统的核心是CPU、内存和总线来工作。另外,随着计算机技术的演进,32位系统之后的x86架构已经有了实模式和保护模式两种模式。系统启动前(BIOS阶段)处于实模式,然后切换到保护模式。实模式是为早期的20位系统设计的一种内存访问方式。cpu的寻址范围是1M,每段最大64K。对于32位系统的内存访问方式,保护方式可以寻址4G的范围。00.快速理解目标操作系统在板子上电时并没有直接运行。需要了解从上电到系统启动的中间过程,比如知道Linux系统启动前CPU做了哪些准备工作,内核是如何加载到内存中运行的等等。结束语BIOS阶段:板子上电,首先读取ROM中的固件代码,建立基本的输入输出系统BootLoader阶段:BIOS开始从引导盘(一般是硬盘的第一个扇区)加载引导代码,并进一步初始化硬件(从实模式切换到保护模式;启动分页管理内存)BootLoader完成了一系列的工作,其中最重要的一步是将系统内核kernel加载到内存中运行。控制权交给内核后,BootLoader时期就结束了,接下来就是内核部分了。01.BIOS阶段BIOS是固化在ROM上的程序。如果您自己安装了操作系统,在第一次启动时,按下某个组合键,显示屏上会弹出一个蓝色的界面。可以调整启动顺序的系统就是我所说的BIOS,然后我们就可以先执行了。内存空间系统工作在实模式下,此时内存地址空间只有1M。在这种模式下,64K的内存地址0xF0000到0xFFFFF被映射到ROM。剩余内存空间在上电过程中分配。主板上电时,CPU首先从ROM加载BIOS程序,BIOS进行硬件相关的初始化(cpu设置CS寄存器为0xffff,ip寄存器为0x0000,所以第一条指令指向地址为0xfff0(实模式下,cs<<4+ip。这里有jmp指令,跳转到rom中的初始化代码)。检查硬件环境主要有两件事,一是建立中断程序和中断向量表,同时在监视器上显示结果。引导操作系统的阶段是BootLoader。引导管理器grub2Linux一般使用grub来做系统引导程序。系统提供grub2工具,grub2用户配置文件/etc/default/grub,系统会根据用户配置自动生成/boot/grub/grub.cfg。常用命令#重新生成配置文件grub-mkconfig-o/boot/grub/grub.cfg#安装Grub2到硬盘引导扇区grub-install--root-directory=//dev/sda引导过程使用grub2-install/dev/sda,可以安装引导程序到/dev/sda。其中有boot.img、core.img<1>boot.img在BIOS平台下,boot.img是grub启动的第一个img文件,写到MBR或分区的引导扇区,因为bootsector的大小是512字节,所以img文件的大小也是512字节。boot.img的唯一作用就是读取属于core.img的第一个扇区并跳转到那里,把控制权交给这个扇区的img。由于大小限制,boot.img无法理解文件系统的结构,所以grub2-install会将core.img的位置硬编码到boot.img中,从而找到core.img的位置。参考文章:https://www.cnblogs.com/f-ck-...<2>core.imgcore.img是由grub2-mkimage程序根据diskboot.img、kernel.img等一系列模块动态创建的.core.img中嵌入了足够的功能模块,保证grub可以访问/boot/grub,可以加载相关模块实现相关功能,比如加载启动菜单,加载目标操作系统的信息等,因为grub2大量使用了动态功能模块,使得core.img的体积足够小。core.img包含多个img文件的内容,包括diskboot.imgkernel.img等。参考文章:https://www.cnblogs.com/f-ck-...启动过程首先将boot.img加载到内存中运行,boot.img将控制权交给diskboot.img后,diskboot的任务.img即加载core.img的其他部分,先解压程序lzma_decompress.img,然后是kernel.img,最后是各个模块module对应的image。根据bootgrub界面上的选项进入启动系统内核的过程。ps:这里要注意,这里的kernel.img不是linux内核,而是grub内核。03.补充知识从实模式切换到保护模式在bootloader过程中,lzma_decompress.img做了一个重要的决定,就是调用real_to_prot,cpu从实模式切换到保护模式。切换到保护模式需要做很多工作,其中大部分与内存的访问方式有关。第一项是启用分段,就是在内存中创建一个段描述符表,把寄存器中的段寄存器变成一个段选择器,指向一个段描述符,这样就可以实现不同进程的切换。第二项是启用分页。可以管理的内存变大了。打开第21地址线GateA20,CPU从20位总线访问内存到32位总线。主引导扇区、分区引导扇区和分区表。硬盘实际上是由扇区组成的。它的起始扇区的一部分是主引导扇区,包括MBR(MasterBootRecord)和DPT(PartitionTable)。硬盘可以有多个分区,每个分区的起始部分是分区引导扇区。分区的引导扇区之后的部分是文件系统的索引。不同的文件系统使用不同的索引,文件系统用它来定位文件在硬盘上的位置。对硬盘的读写操作是通过文件系统完成的;我们不能操作文件系统中引导扇区的内容,需要专门的软件,比如引导管理器。参考资料MasterBootRecord-百科全书Grub2ConfigurationGrub2详解(翻译整理官方手册)Linux引导和启动过程介绍AnintroductiontoGRUB2configurationforyourLinuxmachine
