0
点赞
收藏
分享

微信扫一扫

MBR和loader


MBR
根据我们的常识,计算机的启动过程,主要是载入数据(既可以是单纯的数据,也可以是引用到这些数据的程序指令等)至内存,然后通过CPU进行执行,然后成功运行了操作系统,这样就基本相当于完成了计算机的启动。

第一个程序是什么,怎么被加载的?实际上第一个被加载的程序是BIOS,即Basic Input & Output System系统。

对于其他程序来说,其加载往往直接依赖于操作系统,由操作系统自动的帮助我们完成程序的加载功能。但是对于第一个被启动的程序来说,自然不可能这样子完成加载,否则就变成了一个鸡生蛋、蛋生鸡的问题。因此第一个程序的加载,即BIOS程序的加载不同于其他程序的加载

我们知道,计算机方面一直有兼容性的优良传统——而在早期的时候,Intel 8086处理器有20条地址线(1MB内存空间),但是寄存器都仅仅是16位的。因此对于其内存,会进行一些特别的布置。而当前虽然处理器已经有了很大的进步,其地址线从32位到64位等,但是遵循于兼容性,计算机开机时CPU仍然处于实模式,即仅仅能访问1MB内存,寄存器也是16位的。而由于实模式下的内存实在有限,因此往往其各个部分的用途都是约定好的,如下所示

起始地址 结束地址 大小 用途
FFFF0 FFFFF 16B BIOS入口地址
F0000 FFFFF 64KB
BIOS代码,包括上面介绍的BIOS入口地址
C8000 EFFFF 160KB 映射硬件适配器的ROM或者内存映射式I/O
C0000 C7FFFF 32KB 显示适配器BIOS
B8000 BFFFF 32KB 用于文本模式显示适配器
B0000 B7FFF 32KB 用于黑白显示适配器
A0000 AFFFF 64KB 用于彩色显示适配器
9FC00 9FFFF 1KB EBDA(Extended BIOS Data Area)拓展BIOS数据区
07E00 9FBFF 622080B 可用区域
07C00 07DFF 512B MBR被BIOS加载到此处
00500 07BFF 30464B 可用区域
00400 004FF 256B BIOS Data Area(BIOS数据区)
00000 003FF 1KB Interrupt Vector Table(中断向量表)

实际上,根据上述的表格,我们也很容易知道BIOS是如何被进行加载的——直接映射入内存的对应地址即可(这里的映射是通过硬件实现的,因此和借助于操作系统等程序进行加载是不同的),并且在上述内存地址范围内的固定地址处当作入口地址进行执行,这个固定地址即为0xFFFF0

但是根据前面的介绍,实模式下我们最多也就可以访问1MB的内存空间,也就是在这个入口地址下,我们最多只能访问16B大小的指令,这必然不可能是全部的BIOS程序的指令(否则其无法实现基础功能),因此我们可以猜想到这应该是一个跳转指令。事实上也确实如此,这是一个长跳转指令,命令如下所示

jmp 0xf000:0xe05b

这里大家可以自行查找一下实模式线性地址的资料,这里简单说一下——由于寄存器是16位,而地址空间是20位,因此这里查找地址通过段基址寄存器:段偏移寄存器进行表示地址,其地址结果为16 * 段基址寄存器 + 段偏移寄存器。容易看出来,这里实际上跳转到的地址为0xFE05B处。

这里之后,就基本完成了BIOS的载入内存过程,即可以正式执行BIOS程序。实际上BIOS程序也主要就是简单的检测内存、显卡等外设信息,并初始化硬件并完成中断向量表IVT等并完成向量表的填写等。当执行完这些操作后,BIOS最后会校验启动盘位于0盘0道1扇区的内容——如果该扇区末尾的两个字节分别是0x55、0xaa,则将该扇区内容加载到0x07C00处,然后跳转至该地址并执行;否则会出错。

这里需要说明几点——首先是0盘0道1扇区,实际上就是指的是磁盘最开始的扇区。

其次是0x55,0xaa。这里可以认为是一个标识,用来标记该磁盘中存在可执行程序(实际上就是MBR,Master Boot Record程序),如果存在则表明该扇区中确实存在可执行程序;否则不存在。

下面是将其加载到0x07C00,根据前面的表格我们知道,实际上0x07C00到0x07DFF处512B空间是MBR程序,而一个扇区恰好是512B,因此恰好可以复制完全。

最后是跳转到0x07C00,这里实际上BIOS中执行的指令是

jmp 0x0:0x7C00

最后总结,即入口地址位于0xFFFF0的BIOS可执行程序最后会调用最大大小为512B的位于0x7C00处的MBR可执行程序。

实际上MBR,又名Master Boot Record,即主引导记录,也被称为主引导扇区,主要记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息

loader:在计算机科学中,加载器(也叫程序加载器)属于操作系统的一部分,用于加载程序(programs)和库(libraries)。加载器是执行程序和代码必不可少的组件,正是它负责将程序送入内存,为程序的运行提供准备。加载的工作一旦完成,操作系统才会移交控制权给被加载的程序代码以执行该程序


举报

相关推荐

0 条评论