全网最硬核解读计算机启动原理

目录

  • 一、为什么是 BIOS 主导?
  • 二、内存映射
  • 三、实模式下的内存分布
  • 四、怎么就从 BIOS 里的程序开始执行了
  • 五、BIOS 里到底写了什么程序
  • 六、0x7c00 是啥
  • 七、启动区里的代码写了啥
  • 八、操作系统内核写了啥
  • 九、参考资料
本讲只为讲明白下面一个问题:
我们按下开机键后究竟发生了什么?
好的,这似乎是好多人都特别想搞明白的一个问题,有时候非常纳闷,为什么一个看似这么简单的问题,就是搜不到一个直面问题的答案呢?
好问题,我也不知道为什么会这样,但我猜是因为:
  • 其一,似懂非懂的人太多,他们其实也不知道究竟发生了什么,所以只能模糊大概地说一些教科书上的话 。
  • 其二,知道这个答案的人一定是大牛,大牛要么不回答这个问题,要么就不会简单地回答这个问题 。而我呢,自认为刚好处于两者之间,现在又特别想把自己知道的分享出来,所以你在这里找到了答案 。
我想当你探寻这个问题的答案是,搜到的大多数是这样的描述:
BIOS 按照“启动顺序”,把控制权转交给排在第一位的存储设备:硬盘 。然后在硬盘里寻找主引导记录的分区,这个分区告诉电脑操作系统在哪里,并把操作系统被加载到内存中,然后你就能看到经典的启动界面了,这个开机过程也就完成了 。
这种描述简直太魔幻了,为什么是 BIOS 主导这一切?怎么叫按照启动顺序?这个分区咋就被加载到内存了,有咋告诉电脑操作系统在哪里了?我无法忍受这样的魔幻描述,我非要把它说得清清楚楚 。
首先学一个东西,一定要有一个前置的知识,我们把它当做已知的,我不可能从原子组成分子开始讲原理 。那学习计算机启动过程的前置知识是什么呢?我要求你已知以下几点:
内存是存储数据的地方,给出一个地址信号,内存可以返回该地址所对应的数据 。CPU 的工作方式就是不断从内存中取出指令,并执行 。CPU 从内存的哪个地址取出指令,是由一个寄存器中的值决定的,这个值会不断进行 +1 操作,或者由某条跳转指令指定其值是多少 。
好了,只需要知道这三点前置知识,你就能专业地解释计算机的启动过程了 。
一、为什么是 BIOS 主导?都说开机后,BIOS 就开始运行自己的程序了,又硬件自检,又加载启动区的 。我就不服了,为什么开机后是执行 BIOS 里的程序?为啥不是内存里的?为啥不是硬盘里的?
好的,不要怀疑前置知识,CPU 的工作方式,就是不断从内存中取指令并执行,那为什么会说是执行 BIOS 里的程序呢?这就不得不说说内存映射了 。
二、内存映射CPU 地址总线的宽度决定了可访问的内存空间的大小 。比如 16 位的 CPU 地址总线宽度为 20 位,地址范围是 1M 。32 位的 CPU 地址总线宽度为 32 位,地址范围是 4G 。你可以算算我们现在的 64 位机的地址范围 。
可是,可访问的内存空间这么大,并不等于说全都给内存使用,也就是说寻址的对象不只有内存,还有一些外设也要通过地址总线的方式去访问,那怎么去访问这些外设呢?就是在地址范围中划出一片片的区域,这块给显存使用,那块给硬盘控制器使用,等等。
这样说,其实就不符合我们的前置知识了,所以可以有一种不太正确的理解方式,那就是内存中的这块位置就是显存,那块位置就是硬盘控制器 。我们在相应的位置上读取或者写入,就相当于在显存等外设的相应位置上读取或者写入,就好像这些外设的存储区域,被映射到了内存中的某一片区域一样 。这样我们就不用管那些外设啦,关注点仍然是一个简简单单的内存 。这就是所谓的内存映射 。
太好了,现在又用简单的前置知识就能解释得通了,我们继续往下推 。
三、实模式下的内存分布刚刚说到内存中划分出了一片一片区域给各种外设,那么问题自然就来了,哪块区域,分给了哪块外设了呢?如果是规定,那应该有一张表比较好吧 。嗯没错,还真有,它就是实模式下的内存分布,笔者给它画了一张图:
全网最硬核解读计算机启动原理

文章插图
 
哎哟我真是个小天使,把比例都表现出来了,网上能再找出比我这个更直观的请给我留言 。实模式之后再解释,现在简单理解就是计算机刚开机的时候只有 1M 的内存可用 。


推荐阅读