操作系统—计算机的启动过程

一 预备

在8086系统CPU中,有两个寄存器CS和IP用于保存CPU接下来需要执行的指令地址,具体计算方法为 CS<<4+IP

例如CS=0x7c0,而IP=0x0001,则CS<<4+IP=0x7c01,因此接下来CPU会从内存地址0x7c01中读取一条指令执行。

当取出一条指令执行后,IP的内容会被自动加当前指令占用的字节数,从而指向了下一条指令,于是,处理器又从取出下一条指令执行。

二 BIOS

在计算机刚加电时,CS和IP会被初始化成固定的默认值,CS=0x7c0,IP=0x0000,因此计算机启动时会从0x7c00这个位置开始执行。

0x7c00这个位置被固化了BIOS系统,不要纠结这个系统从哪来的,因为它本身就是在那的。

因此,相当于计算机刚启动时,就会立即开始执行BIOS系统。

BIOS是指基本输入输出系统(Basic Input/Output System),它只做了一件事:从磁盘中把安装在磁盘中的操作系统(如我们使用的windows,linux)加载到内存中,然后通过修改CS和IP寄存器的内容,把CPU的执行控制权交到操作系统中。

具体一点,BIOS会把磁盘中安装的操作系统加载到内存中的0x7c00处,,然后修改CS=0x7c0, IP=0x0000,当CPU读取下一条指令执行时就会读到具体操作系统的指令。

二 主引导扇区

通过上面的描述,你可能觉得BIOS会负责把操作系统的所有内容都加载到内存中去,这但是实际上并不是这样的。

BIOS并不知道具体需要怎样加载操作系统(这很正常,不同的操作系统有不同的加载方式),于是BIOS规定:任何安装在磁盘中的操作系统,必需在磁盘的第0扇区存放一段引导代码,BIOS只把这一段引导代码加载到内存中执行,而具体应该如何加载整个操作系统,由操作系统的编写人员自行在引导代码中定义。

也就是说,BIOS只加载并执行引导代码,而引导代码自行加载整个操作系统。另外值得一提的是,这块存放引导代码的第0扇区被称为主引导扇区,操作系统就是从这里开始的。

这里涉及到磁盘的内容:磁盘中的内容是分扇区维护的,每个扇区共512个字节,第0个扇区为0-511字节,第1个扇区为512-1023字节,依此类推。

将程序交给主引导扇区代码执行后,BIOS就正式功成身退了,毕竟接下来执行的引导代码已经属于操作系统的内容,而具体是怎么执行的,不同的操作系统当然有不同的方法。不过即然已经到操作系统执行了,那么我们可以认为计算机已经启动完毕了。

以上就是计算机启动的整个过程,简单总结就是:

开机时默认初始化CS=0x7c0, IP=0x0000,CPU自动来始执行0x7c00的BIOS代码
BIOS代码把磁盘中第0号扇区的内容加载到0x7c00处,然后修改CS=0x7c0, IP=0x00000,CPU又开始执行操作系统的引导代码

三 linux0.11 的主引导扇区代码

当CPU开始执行引导代码后,计算机就算启动完成了,但是操作系统还没有完全启动成功,接下来以linux0.11为例说说引导代码后续的内容,linux0.11已经是非常老的内容了,但是对于学习操作系统来说,研究它就够了。

linux0.11的主引导扇区代码定义在文件bootsect.s中,这是一段汇编代码。会把操作系统剩下的所有内容都加载到内存中。

操作系统所有的代码都加载到内存中去之后,并不能真正的交给操作系统处理,因为操作系统还需要初始化,所以在此之前还需要执行一断setup.s汇编代码,用于初始化系统。

因加载完毕后bootsect.s会通过修改CS:IP值的方式,让CPU去执行setup.s,至此,bootsect.s代码就算是完成使命了。

setup.s代码存放在磁盘的0-4扇区,会被加载到内存的0x90200处。它主要是初始化了一些系统的基本内容,如内存长度,显卡类型等。然后会把操作系统剩下的核心内容移动到0x0000地址处,再通过修改CS:IP的方式,让CPU开始执行操作系统的核心内容(以下称操作系统内核)。

操作系统内核开始执行前还会先进一步初始化系统,在内核最开始的地方是一个head.s代码段,这里主要是使用一些牛逼的手段调用到C语言的main函数。从这里开始,操作系统终于进入到了C语言编写的内容。

在main函数的头部,还是会先进行进一步的初始化,这个初始化更加仔细,而且也更多,例如初始化了内存管理用的页表,初始化了中断向量表等。到此,操作系统正式启动完成。

总结:linux0.11启动过程:

  • 先执行主引导扇区代码,即bootsect.s代码,把操作系统的所有内存加载到内存中
  • 再执行setup.s代码,它会初始化一些硬件数据,并且把操作系统的内核移动到0x0000地址处
  • 再跳到0x0000地址处开始执行,执行到的是head.s代码段,这里会通过一些比较牛逼的方式调用到C语言编写的main函数中
  • 在main函数中会进一初始化系统,如中断向量,内存管理的数据结构等

再跟上面的结合起来,整个流程就是:
开机 =》执行BIOS系统 =》执行主引导扇区代码(bootsect.s)=》执行setup.s =》执行head.s =》执行C语言main函数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容