第一回-x86计算机Boot过程

万事开头难,今天开始进入基于x86的操作系统世界。平时应该我们大部分同学应该是在开发应用程序,应用程序之所以被称为应用,主要原因就是它运行于操作系统之上。那本系列所要讲述的操作系统呢,它也是一种程序,只不过它是基于硬件的程序,可以被看成是硬件的应用程序。所以在讲述操作系统的过程中会去探索与操作系统亲密相关的硬件部分内容,比如寄存器、CPU中断机制、虚拟内存MMU、IO端口等。

大家在看本文之前可能已经通过各种途径了解到x86计算机上电后首先运行BIOS,然后BIOS会去硬盘加载MBR到0x7C00地址处,并跳转到0x7C00开始运行。这里大家有没有思考过几个问题:一、BIOS的代码是存放在哪里的?二、计算机都是通过内存地址访问程序和数据,那计算机上电后访问的第一个地址是什么?三、跳转到0x7C00地址处运行是使用的CALL指令还是JMP指令呢?本回内容正是要消除这些问题与疑惑,为后续进入操作系统的精彩世界打下基础。

还记得“操作系统灵魂拷问”中的问题1吗?x86计算机通过地址总线访问某个地址,这个地址可以是物理内存条上的地址,也可以是主板上ROM的地址,还可以是某种硬件设备和CPU进行通信的端口地址。现在强硬的给一个耳熟能详的公式,若计算机的地址总线的位数为n,CPU可以访问的地址空间为2的n次方-1。针对本文所述的32位x86计算机,n为32。如下图所示,这些都是硬件层面实现的映射的逻辑,我这里就没法继续深入硬件层面的实现了。我们到了解这里就可以了,至于硬件层面是怎么做的映射有兴趣的同学可以继续和玩硬件的大佬交流。

32位x86计算机启动之后进入实模式,只会使用1M(0xFFFFF)以下的内存空间。即使这样也可以看出1M的地址空间被分成了多段,每段被映射不同硬件设备(ROM,显存,物理内存)的存储空间。所以CPU发出的地址不一定是我们平时理解的都是物理内存条上的内存地址。我们熟知的BIOS就存储在ROM中,并且被映射到0xF0000~0xFFFFF地址空间,CPU访问0xF0000~0xFFFFF的内容就是在运行BIOS。

      BIOS也是程序,程序都入口地址,那入口地址是多少呢?对于这个问题我们可以借助Bochs虚拟机模拟硬件进行观察如下图所示。所以x86计算机启动开始运行BIOS时,寄存器CS:IP分别指向地址0xF000:0xFFF0。你能通过代码段寄存器CS和指令寄存器IP的值如何计算出实模式下的内存地址为0xFFFF0吗(本节先拉通一个框架,先不进入这些细节,后续详解)?地址0xFFFF0到0xFFFFF之间只有16字节,显然容纳不下BIOS的全部代码的。该16B字节内容实际是一个JMP指令,跳到真正的BIOS入口处xF000:E05B执行,如下图所示。

接着BIOS运行过程中会检测硬件,在物理内存低地址段0x000~0x3FF建立中断向量表等,这些中断向量表可以用于基本的输入输出。最后BIOS的一个重要任务就是从磁盘读取MBR(MBR通常位于磁盘的第一扇区),并将MBR加载到内存0x7C00,并跳转到0x7C00执行,像流水一样,一去不复返,不会再返回到BIOS。 

MBR的代码运行后所做的操作比较少,毕竟整个MBR只有512字节,这其中466字节的引导程序,64字节的分区表以及2字节的结束标记魔数“55AA”,MBR结构如下图所示。

   

MBR中的引导程序加载磁盘活动分区操作系统bootloader,所谓活动分区就是该分区上安装有操作系统,将控制权交给bootloader,接下来就是bootloader的个人秀了,由它去加载操作系统。本回先说这么多内容,也许部分同学之前都接触,这里进行了一些细化,下一回将讨论x86的分段机制。但我个人觉得本回还是涉及不少概念和细节,对于本回提到的几个问题以及其它疑惑,欢迎在进行留言区讨论。

======================================================================

各位看官如果对本系列有兴趣,大家一起学习交流,可以加一下该系列微信公众号,鼓励继续写的动力。声明此公众号是个人申请用于交流学习底层技术,不会涉及其他商业行为。

微信公众号链接: https://mp.weixin.qq.com/s/yuXKOHN0GPi4c88sPEmGEw

======================================================================

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值