DOS主引导扇区分析

DOS主引导扇区分析

    基本上这是一篇比较入门级的文章。

    从这篇文章开始,准备用2----3篇的篇幅写一下主引导扇区的分析,先完成DOS下主引导扇区的分析,再分析一下grub下的主引导扇区,同时会简单介绍一下主引导扇区的利用。

    一直以来一直想写一篇关于PC机启动过程的文章,就是从机器上电到BIOS读取主引导扇区并把控制权交给主引导扇区中的引导程序开始,但每次想到这个问题,都感到过程比较复杂,一是自己也不能彻彻底底地搞清楚,二是想不出能写出什么新意,所以就一直没有动笔。但是写这篇文章,是不得不涉及到PC机的启动过程了,好在不是这篇文章的重点,而且只需泛泛说说就可以,所以估计不会出什么大问题。

1、PC机的启动过程

  • 系统上电时,CPU被复位,此时CPU工作在实模式下,CPU执行的第一条指令位于存储器地址0xffff0位置上,用段:偏移的方式表示为:ffff:0。
    我们在DOS下使用debug可以看到位于存储器中该位置上的指令。
     

    我们看到这条指令是:jmp F000:E05B。
    以前我有一篇文章里详细介绍了PC机中的存储器地址结构(《关于A20 Gate》),从这篇文章中可以了解到,F000:E05B这个地址和前面的F000:0都在BIOS中。为什么CPU执行的第一条指令是一条跳转指令呢?因为在实模式下,x86 CPU的最大寻址空间只有:0xFFFFF,而FFFF:0这个位置离CPU可以寻址的最后一个字节只有16个字节的长度,16个字节当然什么都干不了,只好设置一条跳转指令到别的地方去执行指令,可以肯定的是,在FFFF:0这个位置一定是一条跳转指令,但跳转到什么地址去,不同的BIOS是肯定不一样的。
  • 开机自检(POST Power-On Self Test)和显卡初始化。
    POST主要是检查一些重要的设备,比如内存和显卡,由于此时显卡还没有初始化,所以无法显示,当发现问题时,会发出长短不一的“滴滴”声,以区别不同的问题,不同厂家的BIOS,对叫声的定义也有区别。
    POST之后BIOS首先要做的就是进行显卡初始化,然后显示开机画面及相关信息。

  • 内存测试及设备安装。
    我们开机的时候都会看到一个Memory Test的提示,这就是内存测试喽;内存测试后,开始安装一些标准设备,比如IDE、软驱、串口、并口等等,这些标准设备安装后,会检测那些即插即用(Plug & Play)设备,每检测出一个,都会显示一行该设备的相关信息,BIOS会为这些设备分配I/O通道、DMA以及中断。

  • 更新ESCD(Extended System Configuration Data
    设备初始化完成后,系统会显示系统中的所有PCI设备清单,然后我们经常会看到一个提示“Update ESCD… Success”,这就是更新ESCD喽,ESCD是BIOS用来与操作系统交换硬件配置信息的一种方法,这些信息存放在CMOS中,通常ESCD只在系统硬配置发生变化后才会更新,所以不是每次启动机器时都能看到提示。

  • 启动操作系统
    这就是我们要说的重点了,以上都完成后,BIOS会根据CMOS中设置的启动顺序启动相应的设备,我们这里不讨论其他设备,只是假定按顺序系统要启动硬盘了。

    但是这个时候,文件系统并没有建立,BIOS也不知道你的硬盘里存放的是什么东西,要启动的是什么系统,所以BIOS是无法直接启动操作系统的,加之一个硬盘可以有多个分区,每个分区都有可能是一个不同的操作系统,BIOS也无从判断应该从哪个分区启动,所以对待硬盘,所有的BIOS都是读取硬盘的0磁头、0柱面、1扇区的内容,然后把控制权交给这里面的MBR(Main Boot Record)。

2、主引导扇区的结构

要注意,硬盘的磁头和柱面都是从0开始数的,但是扇区是从1开始数的,通常我们硬盘上的这个0磁头、0柱面、1扇区称作第一个物理扇区,一般我们把这个主引导扇区分成三部分,第一部分叫MBR(Master Boot Rocord),主引导记录,这部分有446个字节,从0--445(0x00--0x1BD);另一部分叫做DPT(Disk Partition Table),磁盘分区表,占这个扇区中的其余64个字节,从446--509(0x1BE--0x1FD);第三部分是一个结束标志,占两个字节,从510--511(0x1FE--0x1FF),其正常内容应该是0xAA55(0x55在低地址字节)。

主引导记录中一般有启动代码和数据,使用不同的boot loader,启动代码可能是不同的,这一系列文章将分析DOS下的启动代码和GRUB的启动代码,大家可以比较其中的差异。

不管用什么boot loader,其分区表的结构都是一样的,为了后面文章叙述的方便,我们在这里做一个简单的介绍,分区表可以容纳4个分区的信息,每个分区信息占16个字节,其结构如下:

 

 字节偏移

说明 

 0

引导标志。若值为80H表示活动分区,若值为00H表示非活动分区。

 1-3

本分区的起始磁头号、扇区号、柱面号。其中:磁头号--第1字节;扇区号--第2字节的低6位;柱面号—为第2字节高2位+第3字节8位

 4

分区类型符:
    00H——表示该分区未用(即没有指定);
    01h--FAT12基本分区
    04H--FAT16基本分区
    06H——big FAT16基本分区;

    0BH——FAT32基本分区;

    05H——扩展分区;

    07H——NTFS分区;

    0FH——(LBA模式)扩展分区(83H为Linux分区等)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值