我们之前说了x86作为一个开放的营商环境,可以有实模式和保护模式,一开始是实模式,只有1M的总大小,后来是保护模式,能够变为4G的总大小

我们何时从实模式变化的,我们围绕着这个过程,进行本章的讲解

我们按下计算机的启动按钮的时候,主板就加上电了

这时候没有任何东西,CPU也是处于懵逼的状态

作为一个初创公司的老板,这时候怎么办,我们只能求助于我们的营商中心,自己按照对应的指导来

对应到计算机上,计算机上有一个ROM(Read Only Memory)只读存储器,和平常的RAM(Random Access Memory)不一样,我们平常的内存条是可读可写的,ROM是只读的,上面存储了对应的初始化程序,BIOS,本章的重点 Basic Input and Output System 基本输入输出系统

基本的BIOS界面如下

图片

创业初期,办公室比较小,假如只有1M的内存地址空间,空间有限,基本如下

图片

最上面的ROM区占用了,0xF0000-0xFFFFF这64K的区间,访问这一段的时候,就会访问ROM

电脑刚加载的时候,会将CS设置为0xFFFF,IP设为0x0000,这样就会调到0xFFFF0,在ROM的区间内,做一些初始化的工作

BIOS会检查一下硬件是不是都好的

这时候BIOS也需要提供服务给对应的用户,故建立一个中断向量表,中断服务程序,这时候还需要键盘和鼠标,都是中断进行的,还有对应的显示操作,也就是老板亲自上场干

图片

之后,需要我们开始建立真正的公司,需要了解<<企业经营管理规范>>

如何找到这个<<企业经营管理规范>>呢?

先从门卫大爷入手,问问吧

操作系统一般在硬盘上,在BIOS的界面上,有一个启动盘的选项,一般都在第一个扇区,占512字节,以0xAA55结束

对应有系统启动加载的工具,Grub2(Grand Unified Bootloader Version 2)

Linux上,有对应的命令行工具 grub2-mkconfig -o /boot/grub2/grub.cfg

里面可以进行配置

常见如下:

menuentry ‘CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)’ –class centos –class gnu-linux –class gnu –class os –unrestricted $menuentry_id_option ‘gnulinux-3.10.0-862.el7.x86_64-advanced-b1aceb95-6b9e-464a-a589-bed66220ebee’ {

load_video

set gfxpayload=keep

insmod gzio

insmod part_msdos

insmod ext2

set root=’hd0,msdos1′

if [ x$feature_platform_search_hint = xy ]; then

search –no-floppy –fs-uuid –set=root –hint=’hd0,msdos1′  b1aceb95-6b9e-464a-a589-bed66220ebee

else

search –no-floppy –fs-uuid –set=root b1aceb95-6b9e-464a-a589-bed66220ebee

fi

linux16 /boot/vmlinuz-3.10.0-862.el7.x86_64 root=UUID=b1aceb95-6b9e-464a-a589-bed66220ebee ro console=tty0 console=ttyS0,115200 crashkernel=auto net.ifnames=0 biosdevname=0 rhgb quiet

initrd16 /boot/initramfs-3.10.0-862.el7.x86_64.img

}

这样就会在启动的时候,设置一个启动列表

图片

然后grab2的安装镜像流程如下

我们先进行安装对应的boot.img,由boot.S编译而成,安装到启动盘的第一个扇区,

完成后,从boot.img中从硬盘中加载到内存中的0x7c00运行

因为只有512个字节的总大小,所以boot.img会加载grub2的另一个镜像来进行操作 core.img

就好比问门卫大爷,大爷指了个地方,说去那里找

core.img中包含了很多功能,lzma_decompress.img,diskboot.img,kernel.img的一系列模块组成,功能丰富

图片

boot.img加载了core.img的第一个扇区,disboot.img

diskboot.img将core的其他模块进行了加载操作

首先是加载了lzma_decompress模块,这个模块负责加压缩操作,在加载这个时候,lzma_decompress因为需要解压缩,所以这时候,我们进行模式的切换,

那么切换的操作如下

1.启动分段,内存中建立段描述符表,段寄存器编程段选择器,指向某个段描述符,实现不同进程的切换

2,启动分页,将内存再度分配位相等大小的块

还有一个打开Gate A20的操作,在实模式下,只有20个地址线,保护模式下,第21根要开始起作用了,打开GateA20

这样,我们就对压缩过的kernel.img进行解压缩,跳转到kernel.img进行运行

kernel.img中是调用 startupS,在startupS中,调用grub_main,即为主函数

grub_main执行到最后,就会获取到操作系统的列表

在选择某个系统后,调用grub_menu_execute_entry(),解析对应的系统

读取内核的启动参数,解析镜像头部的数据结构,进行检查,检查后进行读取整个镜像到内存

进行启动实际的内核

总结为如下的一张图

图片

发表评论

邮箱地址不会被公开。 必填项已用*标注