BIOS到bootloader
BIOS
在主板的ROM上保存有BIOS程序,计算机启动首先读取BIOS(Basic Input and Output System,基本输入输出系统)程序进行运行。此时,计算机运行在实模式下,只能访问1MB的空间。这个1MB的空间也有一个标准的约定。
在 x86 系统中,将 1M 空间最上面的 0xF0000 到 0xFFFFF 这 64K 映射给 ROM,也就是说,到这部分地址访问的时候,会访问 ROM。当电脑刚加电的时候,会做一些重置的工作,将 CS 设置为 0xFFFF,将 IP 设置为 0x0000,所以第一条指令就会指向 0xFFFF0,正是在 ROM 的范围内。在这里,有一个 JMP 命令会跳到 ROM 中做初始化工作的代码,于是,BIOS 开始进行初始化的工作。
BIOS的主要工作就是:检查硬件状态是否完好, 建立一个中断向量表和中断服务程序,接收输入指令处理并显示交互。
bootloader
启动盘的前512字节用于保存主引导记录MBR,保存启动程序boot.img。boot.img加载 grub2 的另一个镜像 core.img。core.img 由 lzma_decompress.img、diskboot.img、kernel.img 和一系列的模块组成,功能比较丰富,能做很多事情。
boot.img 加载diskboot.img,diskboot.img 的任务就是将 core.img 的其他部分加载进来,先是解压缩程序 lzma_decompress.img,再往下是 kernel.img,最后是各个模块 module 对应的映像。这里需要注意,它不是 Linux 的内核,而是 grub 的内核。
解压lzma_decompress.img的时候会调用real_to_prot,切换到保护模式,这样就能在更大的寻址空间里面,加载更多的东西。
从实模式切换到保护模式
切换到保护模式的工作:
- 第一项是启用分段,就是在内存里面建立段描述符表,将寄存器里面的段寄存器变成段选择子,指向某个段描述符,这样就能实现不同进程的切换了。
- 第二项是启动分页。能够管理的内存变大了,就需要将内存分成相等大小的块,这些我们放到内存那一节详细再讲。
切换到保护模式后,访问的地址空间就大了。继续运行grub启动程序,选择启动的操作系统。装载启动的内核文件,启动内核。
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。