硬盘分区结构及windows文件系统结构

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

硬盘分区结构及windows文件系统结构

1.关于硬盘分区:

IDE接口硬盘中,不管什么操作系统,都有如下结构:

MBR和基本分区表共用硬盘的第一个扇区(即0面0道1扇区,以后简称第一扇区MBR),分区表位于扇区的最后66字节,除了最后的2字节55AA外,为4条分区记录,每条分区记录16字节。

各字段含义如下:

(注意:C/H/S的编址从0/0/1开始)

可以看出,使用C/H/S三维地址时,磁盘的寻址空间最多只有224个扇区,即8GB的容量,当磁盘容量大

于8GB时,C/H/S就无法寻址了。

于是采用LBA(logic block address)线性地址来寻址。在LBA方式下系统把所以的物理扇区都按某种方式或规则看做是一线性编号的扇区,即从0到某个最大值方式排列。

C/H/S到LBA:

LBA=(C-c)*PH*PS+(H-h)*PS+(S-s)

一般情况下c=0,h=0,s=1,PS=63,PH=255,PS表示每磁道多少扇区,PH表示每柱面多少磁道。

LBA到C/H/S:

C=LBA/(PH*PS)+c

H=(LBA/PS)MOD PH +h

S=LBA MOD PS + s

由于MBR只能记录4个分区的信息,windows通过扩展分区来记录多于4个分区的记录,称做虚拟MBR。

做法是:

让主MBR在定义分区时,将多余容量定义为扩展分区,指定该分区的起始位置,根据起始位置指向硬盘的某一扇区,作为下一个分区表,在该扇区继续定义分区。如果只有一个分区,就定义该分区,然后结束;如果不止一个分区,就定义一个基本分区和一个扩展分区,扩展分区再指向下一个分区表,在下一个分区表中继续定义分区,直至结束。这样就形成一个分区链,可以描述所有的分区。

一个分区表的例子:

(注意:系统在启动时按照分区链的顺序查找分区,直到找出所有分区,如果分区链形成一个环,就形成所谓硬盘"逻辑锁",导致系统无法启动,软盘也无法启动。由于windows启动过程在io.sys中决定的,可以查找io.sys,将第一个55AA改成其他数值,程序还没开始查找分区表就结束,就避开了对分区表的检测)

2.关于INT 13

2.1通过int 13来读取物理扇区的例子:

参数解释:

∙al:读写扇区数

∙bx:缓冲区地址

∙dh:磁头号

∙dl:设备号(A盘是0,B是1,第一硬盘是80,第二硬盘是81)

∙ch:柱面号低8位

∙cl:低6位为要读的起始扇区号,高2位为柱面号的高2位。

2.2扩展INT 13:

数据类型约定:

磁盘地址数据包Disk Address Packet (DAP):

DAP 是基于绝对扇区地址的, 因此利用DAP, Int13H 可以轻松地逾

越1024 柱面的限制, 因为它根本就不需要CHS 的概念.

DAP 的结构如下:

struct DiskAddressPacket

{

BYTE PacketSize; // 数据包尺寸(16字节)

BYTE Reserved; // ==0

WORD BlockCount; // 要传输的数据块个数(以扇区为单位)

DWORD BufferAddr; // 传输缓冲地址(segment:offset,在内存中为offset在低地址

如166b:400在内存中为:00 04 6b 16)

QWORD BlockNum; // 磁盘起始绝对块地址(即LBA地址)

};

驱动器参数数据包Drive Parameters Packet:

驱动器参数数据包是在扩展Int13H 的取得驱动器参数子功能调用中

使用的数据包. 格式如下:

struct DriveParametersPacket

{

WORD InfoSize; // 数据包尺寸(26 字节)

WORD Flags; // 信息标志

DWORD Cylinders; // 磁盘柱面数

DWORD Heads; // 磁盘磁头数

DWORD SectorsPerTrack; // 每磁道扇区数

QWORD Sectors; // 磁盘总扇区数

WORD SectorSize; // 扇区尺寸(以字节为单位)

};

2.2.1) 检验扩展功能是否存在

入口:

AH = 41h

BX = 55AAh

DL = 驱动器号

返回:

CF = 0

AH = 扩展功能的主版本号

AL = 内部使用

BX = AA55h

CX = API 子集支持位图

CF = 1

AH = 错误码01h, 无效命令

这个调用检验对特定的驱动器是否存在扩展功能.如果进位标志置1 则此驱动器不支持扩展功能. 如果进位标志为0, 同时BX = AA55h, 则

存在扩展功能. 此时CX 的0 位表示是否支持第一个子集,1位表示是否

支持第二个子集.

对于1.x 版的扩展Int13H 来说, 主版本号AH = 1. AL是副版本号, 但这仅限于BIOS 内部使用, 任何软件不得检查AL 的值.

2.2.2) 扩展读

入口:

AH = 42h

DL = 驱动器号

DS:SI = 磁盘地址数据包(Disk Address Packet)

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用将磁盘上的数据读入内存. 如果出现错误, DAP 的BlockCount 项中则记录了出错前实际读取的数据块个数.

2.2.3) 扩展写

入口:

AH = 43h

AL

0 位= 0 关闭写校验

1 打开写校验

1 - 7 位保留, 置0

DL = 驱动器号

DS:SI = 磁盘地址数据包(DAP)

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用将内存中的数据写入磁盘. 如果打开了写校验选项,但BIOS 不支持, 则会返回错误码AH = 01h, CF = 1. 功能48h可以检测BIOS是否

支持写校验.

如果出现错误, DAP 的BlockCount项中则记录了出错前实际写入的数

据块个数.

2.2.4) 校验扇区

入口:

AH = 44h

DL = 驱动器号

DS:SI = 磁盘地址数据包(Disk Address Packet)

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

相关文档
最新文档