- A+
大家好,我是呼噜噜,在上一篇文章聊聊x86计算机启动发生的事?我们了解了x86计算机启动过程,MBR、0x7c00是什么?其中当bios引导结束后,操作系统接过计算机的控制权后,发生了哪些事?本文将揭开迷雾的序章-Bootsect.S
回顾计算机启动过程
我们先来回顾一下,上古时期计算机按下电源键的启动过程,这里以8086架构为例:
8086、80x86是什么意思?
有许多人不知道 经常遇到的8086、80x86是什么意思?我们简单科普一下:
- 8086是Intel公司推出的最早,也是最流行的面向个人电脑的CPU型号
- x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构,由于以“86”作为结尾,因此其架构被称为"x86"
- 80x86也就是在8086基础上的增强版,包括80286,80386,80486,其后面就是我们所熟悉的奔腾、酷睿、i5、i7等等
寄存器初始化CS:IP
相比于上一篇文章聊聊x86计算机启动发生的事,我们这里再讲细致点,当计算机一按下电源后,8086CPU就处于实模式的状态,此时会将CPU的寄存器初始化为CS=0xFFFF;IP=0x0000
,也就是实际物理地址0xFFFF0
(CS左移4位+IP)
CS : 代码段寄存器;IP : 指令指针寄存器。CS:IP指向的内容 会被CPU当做计算机指令去执行
那么从地址0xFFFF0
中取出来的指令是什么?我们知道当电路通电后,内存是一片空白的,内存断电后 数据是无法保存的,所以BIOS程序需要事先被刷入只读存储器ROM中。物理地址0xFFFF0
就是指向这样一段BIOS ROM
CPU是如何和ROM相连的?
那么问题又来了,CPU是如何和ROM相连的?CPU 不仅和ROM相连,还和RAM(俗称内存),IO接口等设备相连,他们是通过总线相连。还好当时笔者将计算机组成原理好好复习了一遍,不然这部分真挺难理解的。
总线是贯穿整个系统的是一组电子管道,是连接各个部件的信息传输线,是各个部件共享的传输介质,称作总线,它携带信息字节并负责在各个计算机部件间传递。
总线按系统总线传输信息内容的不同,又可以分为3 种:数据总线、地址总线和控制总线。我们这里用到的就是地址总线,把 0xFFFF0 作为 CPU 的地址总线信号传输出去,去这个地址总线对应的位置处找
由于计算机有多个设备,必然会存在多个设备同时竞争总线控制权的问题,这时候就需要总线仲裁,让某个设备优先获得总线控制权,获得了总线控制权的设备,才能开始传送数据。未获胜的设备只能等待获胜的设备处理完成后才能执行。
我们简单总结一下:当总线仲裁器仲裁通过后,CPU可以依靠地址总线寻址,找到对应设备ROM上地址0xFFFF0
处的内容。
拓展可见:什么是计算机中的高速公路-总线?
加载MBR到内存中
当BIOS自检完成,设置启动顺序后,利用 BIOS 的输入功能将启动磁盘的启动扇区MBR(也叫第一扇区,主引导记录)的内容原封不动地搬到内存的0x7C00
地址处,并设置CPU寄存器CS=0x07C0,IP=0x0000
。到这一步,计算机的控制权将交到操作系统手中!
为什么是0x7C00这个地址?如何得出?别再问了,本文不再解释了,具体看笔者的上一篇文章聊聊x86计算机启动发生的事
对于Linux0.12来说,第一个程序Bootsect.S 编译成二进制后,需要事先放到主引导记录MBR中,MBR大小就是一个扇区的大小512字节,如果这512字节的最后两个字节是0x55AA
,表明这个设备可以用于启动。只有这样我们BIOS才能识别它,才能把bootsect.S加载到内存中。
如果不是0x55和0xAA,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。如果到最后还是没找到符合条件的,直接报出一个无启动区的error。
下面我们看下操作系统编译后,存放在储存设备(硬盘)的模块分布:
先简单介绍一下,不必深究,后续文章会娓娓道来:
- bootsect.s的主要作用就是加载操作系统,把操作系统从硬盘中,加载到内存里去
- setup.s的主要作用:首先获得光标,内存,显卡,磁盘等硬件参数存放在内存空间中,方便后续程序使用;临时建立gdt、idt表,并且从实模式进入到了保护模式
- 在linux0.12源码,boot目录下还有一个head.s,在上图中被归于system模块,属于操作系统主体文件,主要是进行进入保护模式之后的初始化工作
- system模块:就是操作系统的主体,比如文件系统,IO,进程等模块。 Linux0.12 内核 system 模块大约占随后的 260 个扇区。
更多精彩文章在