第 9 章
使用大容量硬盘
使用大容量硬盘
在上一章中,我们讨论了BIOS-Disk的功能以及使用中断来访问硬盘的物理介质。我们在那里使用 INT 13H 函数来访问硬盘。
INT 13H接口支持多种不同的命令,如读取、写入、格式化和验证等,这些命令可以传递给BIOS,然后BIOS将它们传递给硬盘。由于 DOS 长期使用 INT13H,因此多年来它一直是标准。
INT 13H 为磁盘几何规范分配 24 位,并要求调用程序了解硬盘的具体参数,并为例程提供精确的磁头、柱面和扇区寻址以访问磁盘。
BIOS 使用 BIOS 设置程序中配置的硬盘几何形状。 INT 13H 接口为磁盘几何规范分配的 24 位分解如下:
- 10 位表示气缸号。因此,总柱面数的最大限制为 1024 个柱面。
- 8位表示头号。因此,进球总数的最大限制为256个。
- 6 位表示扇区号。因此,扇区总数最多可达 63 个。
因此该方式支持的最大扇区数可达1024*256*63=16515072个。
这意味着 INT13H 接口可以支持包含最多约 1650 万个扇区的驱动器,每个扇区 512 字节,最大可达 8.46 GB。这正是我想要解释的。因此,使用所有这些函数或 INT 13H 我们只能访问最大 8.46 GB 的磁盘。
这就是为什么近年来这种旧接口的局限性导致它被废弃,转而采用一种新的方式处理硬盘,这将在本章后面描述。
首先我给大家讲一个故事吧!
十一年前,当我上七年级的时候,我在学校听说过一种 42MB 的硬盘,也许是 IBM 的 WDA-L42。我和朋友们当时真的很难想象一块硬盘的容量竟然有这么大。
INT 13H 方法是从今天算起大约二十年前开发的。现在你可以看到,8GB 的硬盘比当时任何人想象的都要大得多。但今天,如果我们向任何 PC 用户谈论 8GB 硬盘,他可能都不想使用它,说它的存储容量小。
这就是为什么 INT 13H 接口在现代系统中最终失去了其用处的原因。 INT 13H 使用 24 位来分配磁盘几何图形,不幸的是,现有的 BIOS INT 13H 接口无法扩展,因为如果这样做,许多旧的硬件和软件产品将停止工作,你可以理解,当数百万旧的软件和硬件产品停止工作时,今天的计算机市场永远无法承受如此大的变化。
鉴于这种情况,INT 13H 被称为 INT 13H 扩展的新接口所取代。但是,INT 13H 可能仍被 DOS 和一些其他较旧的操作系统使用,以及用于其他兼容性目的。
新的 INT 13H 接口使用 64 位而不是 24 位进行寻址,允许最大硬盘大小为 9.4 * 1021 字节,实际上是 9.4 万亿千兆字节或 940000000000000 千兆字节。希望我们现在可以冷静一段时间,直到突破这个极限。
下面介绍中断13H的一些重要的扩展函数。您可以在编程中以与使用 INT 13H 函数相同的方式使用这些函数。这也是这些函数被称为 INT 13H 扩展的原因。
INT 13H 扩展:
内部 13H (0x13)
功能 1BH (0x1B 或 27) --> 获取生产头 (ESDI 固定磁盘)
跟注:AH = 1BH
AL = 要读取的扇区数
DL = 驱动器
ES:BX = 生产头缓冲区
(缺陷清单)
返回:如果函数成功
进位标志 = 清除
啊= 00X
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数用于获取固定磁盘的制造标头。读取的第一个扇区包含制造标头、缺陷条目数和缺陷图的开头;其余扇区包含缺陷图的其余部分。制造标头格式(缺陷图记录格式)可在 IBM 70MB、115MB 固定磁盘驱动器技术参考中找到。
INT 13H (0x13)
功能 1BH(0x1B 或 27)--> 获取指向 SCSI 磁盘信息块的指针(未来域 SCSI 控制器)
跟注:AH = 1BH
DL = 硬盘 ID
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
ES:BX = SCSI 磁盘信息块
评论:
此函数用于获取指向 SCSI 磁盘信息块的指针。这还会设置一个不可重置的标志,以防止显示某些控制器消息。
INT 13H (0x13)
功能 1CH(0x1C 或 28)——> 获取指向空闲控制器 Ram 的指针(未来域 SCSI 控制器)
呼叫:AH = 1CH
DL = 任何有效 SCSI 的硬盘驱动器 ID
硬盘
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
ES:BX = 控制器上可用 RAM 的第一个字节
评论:
此函数用于获取空闲的控制器 RAM。ES:BX 指向控制器上空闲 RAM 的第一个字节,可用于其他用途。ES 包含控制器所在的段。控制器的两个内存映射 I/O 端口位于偏移量 1C00H 和 1E00H。
INT 13H (0x13)
功能1C08H (0x1C08) --> 获取命令完成状态 (ESDI固定磁盘)
调用:AX = 1C08H
DL = 驱动器
ES:BX = 命令完成缓冲区
状态块
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数用于获取命令完成状态。如果函数成功,则清除进位标志,如果不成功,则设置进位标志。
INT 13H (0x13)
功能 1C09H (0x1C09)-->获取设备状态 (ESDI 固定磁盘)
调用:AX = 1C09H
DL = 驱动器
ES:BX = 设备状态块缓冲区
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数用于获取设备状态。如果函数成功,则清除进位标志,如果不成功,则设置进位标志。
INT 13H (0x13)
功能 1C0AH (0x1C0A) --> 获取设备配置 (ESDI 固定磁盘)
调用:AX = 1C0AH
DL = 驱动器
ES:BX = 驱动器配置状态缓冲区
堵塞
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数用于获取磁盘的设备配置。如果函数成功,则清除进位标志,AH 寄存器为 01H,否则设置进位标志,AH 寄存器返回状态。下表显示了 ESDI 驱动器配置状态块的格式:
抵消
|
尺寸
|
描述
|
00小时
|
字节
|
09H
|
01小时
|
字节
|
块中的字数(06H)
|
02小时
|
字节
|
旗帜
|
03小时
|
字节
|
每柱面备用扇区数
|
04 小时
|
双字
|
可用扇区总数
|
08小时
|
单词
|
总气缸数
|
0AH
|
字节
|
每缸磁道数
|
0BH
|
字节
|
每磁道扇区数
|
INT 13H (0x13)
功能 1C0BH (0x1C0B) --> 获取适配器配置 (ESDI 固定磁盘)
调用:AX = 1C0BH
ES:BX = 控制器配置的缓冲区
状态块
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数用于获取适配器配置。如果函数成功,则清除进位标志,AH 为 01H,如果不成功,则设置进位标志,AH 返回状态。
INT 13H (0x13)
功能 1C0CH (0x1C0C)-->获取 POS 信息 (ESDI 固定磁盘)
调用:AX = 1C0CH
ES:BX = POS 信息状态缓冲区
堵塞
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数用于获取POS信息。如果函数成功,则清除进位标志,AH为01H,如果不成功,则设置进位标志,AH返回状态。
INT 13H (0x13)
函数 1C0EH (0x1C0E) --> 将 RBA 转换为 ABA (ESDI 固定磁盘)
调用:AX = 1C0EH
CH = 气缸号的低8位
CL = 扇区号(扇区号的高两位)
位 6 和 7 中的气缸号)
DH = 头号
DL = 驱动器号
ES:BX = ABA(绝对块地址)
数字
返回:如果函数成功
进位标志 = 清除
AH = 01H
如果功能失败
进位标志 = 设置
AH = 状态
评论:
此函数将 RBA (相对块地址) 转换为 ABA (绝对块地址)。如果函数成功,则进位标志被清除,AH 寄存器为 01H,否则设置进位标志,AH 返回状态。
INT 13H (0x13)
功能 20H(0x20 或 32)——> 获取当前媒体格式(Compaq ATAPI 可移动媒体设备)
呼叫:AH = 20H
DL = 驱动器号
返回:如果函数成功,
进位标志 = 清除
AL = 媒体类型
AH = 00H
如果功能失败,
CF = 设置
AH = 错误代码
评论:
此函数用于获取当前媒体格式。下表给出了 Compaq/ATAPI 软盘媒体类型的值:
价值
|
媒体
|
03小时
|
720K(1M 未格式化)
|
04 小时
|
1.44M (2M 未格式化)
|
06小时
|
2.88M (4M 未格式化)
|
0通道
|
36 万
|
0DH
|
1.2米
|
0EH
|
东芝3模式
|
0FH
|
NEC 3模式(每扇区1024字节)
|
10H
|
ATAPI 可移动媒体设备
|
INT 13H (0x13)
功能 21H(0x21 或 33)——> 读取多个磁盘扇区(PS 和 PS/2、硬盘)
呼叫:AH = 21H
AL = 要读取的扇区数
CH = 12 位柱面号的低字节
CL = 起始扇区(位 0 至 5)和位 8
和 9 个气缸(第 6 和第 7 位)
DH = 磁头编号(位 0 至 5)和位 10
和气缸 11(位 6 和 7)
DL = 驱动器号
ES:BX = 要读取的数据缓冲区
返回:如果函数成功,
进位标志 = 清除
ES:BX = 已填充数据缓冲区
如果功能失败,
进位标志 = 设置
AH = 状态
评论:
该函数用于使用多块模式读取多个磁盘扇区,该模式仅在传输一组扇区之后而不是每个扇区之后才产生中断。
INT 13H (0x13)
功能 22H(0x22 或 34)——> 写入多个磁盘扇区(PS 和 PS/2、硬盘)
呼叫:AH = 22H
AL = 要写入的扇区数
CH = 12 位柱面号的低字节
CL = 起始扇区(位 0 至 5)和位 8
和 9 个气缸(第 6 和第 7 位)
DH = 磁头编号(位 0 至 5)和位 10
和气缸 11(位 6 和 7)
DL = 驱动器号
ES:BX = 包含要写入的数据的缓冲区
返回:如果函数成功,
进位标志 = 清除
AH = 01H
如果函数失败,
进位标志 = 设置
AH = 状态
评论:
该函数用于使用多块模式写入多个磁盘扇区,该模式仅在传输一组扇区之后而不是每个扇区之后才产生中断。
INT 13H (0x13)
功能 22H (0x22 或 34) --> 启用/禁用缓存 (QuickCache II v4.20)
呼叫:AH = 22H
AL = 新状态(如果禁用则为 00H,如果禁用则为 01H,
如果已启用)
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数启用和/或禁用所有驱动器的缓存。如果函数成功,则 AX 寄存器为 0000H,否则返回状态。
INT 13H (0x13)
功能 23H (0x23 或 35) --> 设置控制器功能寄存器 (PS 和 PS/2、硬盘)
呼叫:AH = 23H
AL = 要素编号
DL = 驱动器号
返回:如果函数成功,
进位标志 = 清除
如果功能失败,
进位标志 = 设置
AH = 状态
评论:
此功能用于设置控制器功能寄存器。如果功能成功,则清除进位标志,如果不成功,则设置进位标志,AH 寄存器返回状态
INT 13H (0x13)
功能 24H(0x24 或 36)--> 设置多种传输模式(硬盘、PS 和 PS/2)
呼叫:AH = 24H
AL = 每块的扇区数
DL = 驱动器号
返回:如果函数成功,
进位标志 = 清除
如果功能失败,
进位标志 = 设置
AH = 状态
评论:
此功能用于设置多路传输模式。如果要禁用多路传输模式,请将扇区数设置为 0。块大小的最大值(如 2、4、6、8 和 16 等)取决于固定磁盘驱动器类型。
该值存储在由 POST(开机自检)创建的固定磁盘驱动器参数表的字节 15H 中。地址 0040H:0074H 处的字节设置为操作状态。PS/1 硬盘功能编号的值已列在下表中:
价值
|
描述
|
01小时
|
选择 8 位数据传输而不是 16 位
|
02小时
|
启用写入缓存
|
22 小时
|
写入相同的、用户指定的区域
|
33H
|
禁用重试
|
44小时
|
设置读长/写长 ECC 字节数
|
54H
|
设置缓存段
|
55H
|
禁用前瞻
|
66H
|
禁用恢复开机默认设置
|
77H
|
禁用错误更正
|
81H
|
选择 16 位数据传输(默认)
|
82H
|
禁用写入缓存
|
88H
|
启用错误更正(默认)
|
99H
|
启用重试(默认)
|
急性肾上腺皮质激素
|
启用前瞻
|
百比黑
|
将读取长/写入长的 ECC 长度设置为四个字节
|
中枢神经系统
|
启用恢复开机默认设置
|
发育性髋关节脱位
|
写入相同的整个磁盘
|
INT 13H (0x13)
功能 24H(0x24 或 36)--> 设置扇区(QuickCache II v4.20)
调用方式:AX = 24H
BX = 新的扇区缓冲区数量
缓存
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于设置扇区。如果函数成功,AX 寄存器为 0000H,否则 AX 返回状态。
INT 13H (0x13)
功能 25H(0x25 或 37)--> 识别驱动器(硬盘、PS 和 PS/2)
呼叫:AH = 25H
DL = 驱动器号
ES:BX = 用于回复数据包的 512 字节缓冲区
返回:如果函数成功,
进位标志 = 清除
缓冲区已填充驱动器信息块
如果功能失败,
进位标志 = 设置
AH = 状态
评论:
此功能用于识别驱动器。地址 0040h:0074h 处的字节设置为操作的状态。IBM 正式将此功能归类为可选。下表给出了一般驱动器配置的位字段:
位
|
描述
|
0
|
保留 (0)
|
1
|
硬扇区
|
2
|
软分区
|
3
|
未进行 MFM 编码
|
4
|
头部切换时间大于15毫秒
|
5
|
实现主轴电机控制选项
|
6
|
固定驱动
|
7
|
可移动盒式驱动器
|
8
|
磁盘传输速率小于或等于5Mbs
|
9
|
磁盘传输速率大于 5Mbs 但小于或等于 10Mbs
|
10
|
磁盘传输速率大于10Mbs
|
11
|
转速误差大于0.5%
|
12
|
提供数据选通偏移选项
|
十三
|
提供轨道偏移选项
|
14
|
需要格式化速度容差间隙
|
15
|
为非磁性驱动器保留 (0)
|
ATA(AT 附件)规范中给出的驱动器信息块格式的描述如下表所示:
抵消
|
尺寸
|
描述
|
00小时
|
单词
|
常规驱动器配置
|
02小时
|
单词
|
汽缸数
|
04 小时
|
单词
|
预订的
|
06小时
|
单词
|
磁头数量
|
08小时
|
单词
|
每条轨道的未格式化字节数
|
0AH
|
单词
|
每个扇区未格式化的字节数
|
0通道
|
单词
|
每磁道扇区数
|
0EH
|
6 字节
|
供应商唯一
|
14 小时
|
20 字节
|
ASCII 格式的序列号(0000H=未指定)
|
28小时
|
单词
|
缓冲类型
|
2AH
|
单词
|
缓冲区大小以 512 字节为增量(0000H=未指定)
|
双通道
|
单词
|
读/写长命令中传递的 ECC 字节数 0000H = 未指定
|
2EH
|
8 字节
|
固件修订版本(ASCII 格式),0000H=未指定
|
36H
|
40 字节
|
型号以 ASCII 表示,0000H=未指定
|
5EH
|
单词
|
位 15-8 供应商唯一,位 7-0,(如果 00H = 未执行读取/写入多个命令,则 xxH = 读取和写入多个命令时每次中断可传输的最大扇区数)
|
60H
|
单词
|
0000H = 无法执行双字 I/O,0001H = 可以执行双字 I/O。
|
62H
|
单词
|
位 15-9(0=保留)、位 8(1=DMA 支持)、位 7-0 供应商唯一。
|
64H
|
单词
|
预订的
|
66H
|
单词
|
位 15-8 PIO 数据传输周期时序模式,位 7-0 供应商唯一
|
68H
|
单词
|
位 15-8 DMA 数据传输周期时序模式,位 7-0 供应商唯一
|
6AH
|
单词
|
位 15-1 保留,位 0(1=翻译模式下报告的字段有效,0=翻译模式下报告的字段可能有效)
|
6通道
|
单词
|
当前气缸数
|
6EH
|
单词
|
现任领导人数
|
70H
|
单词
|
每磁道当前扇区数
|
72小时
|
双字
|
当前各部门的容量
|
76H
|
>单词
|
预订的
|
78H
|
136 字节
|
未定义
|
100H
|
64 字节
|
供应商唯一
|
140H
|
96 字节
|
预订的
|
INT 13H (0x13)
功能 25H(0x25 或 37)--> 设置刷新间隔(QuickCache II v4.20)
呼叫:AH = 25H
BX = 冲洗间隔
返回:如果函数成功,
啊= 0000H
如果功能失败,
AH = 状态
评论:
此函数用于设置刷新间隔。如果函数成功,AH 为 0000H,否则 AH 返回状态。
INT 13H (0x13)
功能 26H (0x26 或 38) --> QuickCache II v4.20 卸载
呼叫:AH = 26H
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
对于被另一个 TSR 挂起的中断向量,AX 返回状态从 0001H 到 00FFH
INT 13H (0x13)
功能 27H (0x27 或 39) --> 安装检查 (QuickCache II v4.20)
呼叫:AH = 27H
BX = 0000H
返回:BH = 主要版本
BL = 二进制次要版本
如果已安装,
AX = 0000H
BX = 非零
评论:
如果安装,AX 寄存器为 0000H 且 BX 返回非零值。
INT 13H (0x13)
功能 28H(0x28 或 40)--> 设置自动卸载(QuickCache II v4.20)
呼叫:AH = 28H
AL = 新州
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
使用 AL = 00H 调用函数来禁用,使用 AL = 01H 调用函数来启用。
INT 13H (0x13)
功能 29H (0x29 或 41) --> 无操作 (QuickCache II v4.20)
呼叫:AH = 29H
返回:AX = 0000H
INT 13H (0x13)
函数 2AH(0x2A 或 42)--> 设置缓冲区大小(QuickCache II v4.20)
跟注:AH = 2AH
AL = 缓冲区大小
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
该函数用于设置缓冲区大小。如果函数成功则AX为0000H,如果不成功则AX返回状态。
INT 13H (0x13)
功能 2BH(0x2B 或 43)--> 驱动器访问声音(QuickCache II v4.20)
跟注:AH = 2BH
AL = 新状态(00h 禁用,01h
已启用)
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
如果函数成功,AX 为 0000H,如果不成功,AX 返回状态。调用函数 AL = 00H 以禁用,AL = 01H 以启用驱动器访问声音
INT 13H (0x13)
功能 2CH(0x2C 或 44)--> 设置缓冲写入(QuickCache II v4.20)
呼叫:AH = 2CH
AL = 新州
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此功能可启用或禁用所有驱动器的延迟写入。使用 AH=38H 可更改单个驱动器。使用 AL = 00H 可禁用,使用 01H 可启用。
INT 13H (0x13)
功能 2DH(0x2D 或 45)--> 设置缓冲读取(QuickCache II v4.20)
跟注:AH = 2Dh
AL = 新状态(00h 禁用,01h
已启用)
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此功能可启用或禁用所有驱动器的预读。使用 AL = 00H 禁用,使用 AL = 01H 启用。使用 AH=37H 更改单个驱动器。
INT 13H (0x13)
功能 2EH(0x2E 或 46)--> 设置刷新计数(QuickCache II v4.20)
跟注:AH = 2EH
BX = 刷新次数
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
该函数用于设置刷新计数。如果该函数成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。
INT 13H (0x13)
功能 2FH(0x2F 或 47)--> 强制立即增量刷新(QuickCache II v4.20)
跟注:AH = 2FH
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
如果函数成功则AX为0000H,如果不成功则AX返回状态。
INT 13H (0x13)
功能 30H (0x30 或 48) --> 获取信息 (QuickCache II v4.20)
呼叫:AH = 30H
AL = 信息编号(见
评论)
DS:DX = 信息缓冲区
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于获取由 AL 指定的有关系统的不同类型的信息。如果函数成功,则 AX 为 0000H,如果失败,则 AX 返回状态。AX = 8000H 表示无效信息说明符。要指定给 AL 的信息编号已列在下表中:
价值
|
描述
|
00小时
|
系统信息
|
01小时
|
驱动器信息
|
02小时
|
访问频率(30 个字的数组)
|
03小时
|
驱动器索引(32 字节数组,指示 DOS 驱动器的 BIOS 驱动器)
|
INT 13H (0x13)
功能 31H (0x31 或 49) --> 保留内存 (QuickCache II v4.20)
呼叫:AH = 31H
BX = 段落数
常规内存保留
应用程序。
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于为应用程序保留内存。如果函数成功,AX 为 0000H,如果不成功,AX 返回状态。
INT 13H (0x13)
功能 32H (0x32 或 50) --> 启用特定驱动器的缓存 (QuickCache II v4.20)
调用方式:AH = 32H
AL = 驱动器号
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于为特定驱动器启用缓存。例如,调用函数,其中 AL = 00H 表示 A: 等等。如果函数成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。
INT 13H (0x13)
功能 33H(0x33 或 51)--> 禁用特定驱动器的缓存(QuickCache II v4.20)
呼叫:AH = 33H
AL = 驱动器号
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于禁用特定驱动器的缓存。例如,调用函数,其中 AL = 00H 用于 A: 等。如果函数成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。
INT 13H (0x13)
功能 34H(0x34 或 52)--> 锁定/解锁扇区(QuickCache II v4.20)
呼叫:AH = 34H
AL = 锁定/解锁功能编号
(参见评论中给出的表格)
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于调用由 AL 指定的扇区的锁定/解锁函数。如果函数成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。下表给出了要使用 AL 调用的不同函数编号:
价值
|
功能
|
00小时
|
结束扇区锁定/解锁
|
01小时
|
将所有访问的扇区锁定到缓存中
|
02小时
|
解锁所有访问的扇区并从缓存中丢弃
|
INT 13H (0x13)
功能 35H(0x35 或 53)--> 设置锁池大小(QuickCache II v4.20)
呼叫:AH = 35H
BX = 锁池中的扇区数
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
该函数用于设置锁池大小,成功则AX为0000H,失败则AX返回状态。
INT 13H (0x13)
功能 36H(0x36 或 54)--> 设置跟踪缓冲区大小
呼叫:AH = 36H
AL = 跟踪缓冲区的新大小
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此功能用于设置跟踪缓冲区大小。如果功能成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。此功能通常与 INT 13H 的功能 24H 一起调用,AL=05H。
INT 13H (0x13)
功能 37H(0x37 或 55)--> 为特定驱动器设置缓冲读取(QuickCache II v4.20)
呼叫:AH = 37H
AL = 新州
DL = 驱动器号
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此功能用于设置特定驱动器的缓冲读取。如果 AL = 00H,则状态为启用,否则为禁用。如果功能成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。
INT 13H (0x13)
功能 38H(0x38 或 56)--> 为特定驱动器设置缓冲写入(QuickCache II v4.20)
呼叫:AH = 38H
AL = 新州
DL = 驱动器号
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此功能用于为特定驱动器设置缓冲写入。如果 AL = 00H,则状态为启用,否则为禁用。如果功能成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。
INT 13H (0x13)
功能 39H(0x39 或 57)--> 设置特定驱动器的读取缓冲区大小(QuickCache II v4.20)
呼叫:AH = 39H
AL = 读取缓冲区的新大小
DL = 驱动器号
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于设置特定驱动器的读取缓冲区大小,例如 A: 的 DL = 00H 等等。如果函数成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。
INT 13H (0x13)
功能 3AH(0x3A 或 58)--> 设置特定驱动器的写入缓冲区大小(QuickCache II v4.20)
跟注:AH = 3AH
AL = 写入缓冲区的新大小
DL = 驱动器号
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此函数用于设置特定驱动器的写入缓冲区大小,例如 A: 的 DL = 00H 等等。如果函数成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。
INT 13H (0x13)
功能 3DH(0x3D 或 61)--> 启用/禁用驱动器的磁柱刷新(QuickCache II v4.20)
跟注:AH = 3DH
AL = 新州
DL = 驱动器号
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此功能用于启用/禁用特定驱动器的柱面刷新,例如 DL = 00H 表示 A: 等。如果功能成功,则 AX 为 0000H,如果不成功,则 AX 返回状态。如果 AL 寄存器设置为 01H,则状态为启用,否则为禁用。
INT 13H (0x13)
功能 3EH(0x3E 或 62)--> 设置单扇区奖励(QuickCache II v4.20)
呼叫:AH = 3EH
AL = 奖金新值
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
本函数用于设置单扇区奖励,成功则AX为0000H,失败则AX返回状态。
INT 13H (0x13)
函数 3FH(0x3F 或 63)--> 设置奖励阈值(QuickCache II v4.20)
跟注:AH = 3FH
AL = 奖金门槛新值
返回:如果函数成功,
AX = 0000H
如果功能失败,
AX = 状态
评论:
此功能用于设置奖励阈值。如果功能成功,AX 为 0000H,如果不成功,AX 返回状态
INT 13H (0x13)
功能 41H (0x41 或 65) --> 安装检查 (IBM/MS INT 13H 扩展)
呼叫:AH = 41H
BX = 55AAH
DL = 驱动器号 (80H-FFH)
返回:如果扩展支持并且功能成功,
进位标志 = 清除
BX=AA55H
AH = 扩展的主要版本(请参阅
表格见评论)
AL = 内部使用
CX = API 子集支持位图(参见
表格见评论)
DH = 扩展版本(v2.0 及更高版本)
如果扩展不受支持或功能失败,
进位标志 = 设置
AH = 01H(功能无效)
评论:
此函数检查 IBM/MS INT 13H 扩展是否已安装并受支持。下表给出了扩展主要版本的值:
价值
|
扩展的主要版本
|
01小时
|
1.x
|
20H
|
2.0 / EDD-1.0
|
21H
|
2.1 / 基本数据-1.1
|
30小时
|
EDD-3.0
|
IBM/MS INT 13H 扩展 API 支持位图的位字段如下表所示:
位
|
描述
|
0
|
支持扩展磁盘访问功能(AH=42H、43H、44H、47h 和 48H)。
|
1
|
支持可移动驱动器控制器功能(AH=45H、46H、48H、49H 和 INT15/AH =52H)。
|
2
|
支持增强磁盘驱动器 (EDD) 功能 (AH=48H 和 AH=4EH)。扩展驱动器参数表有效。
|
3-15
|
保留 (0)
|
INT 13H (0x13)
功能 42H(0x42 或 66)——> 扩展读取(IBM/MS INT 13H 扩展)
呼叫:AH = 42H
DL = 驱动器号
DS:SI = 磁盘地址包(参见
评论)
返回:如果函数成功,
进位标志 = 清除
AH = 00H
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
此函数是磁盘读取函数的扩展。如果函数成功,则清除进位标志,AH 寄存器为 00H,否则设置进位标志,AH 返回错误代码。磁盘地址包的块计数字段设置为成功传输的块数。磁盘地址包的格式如下:
抵消
|
尺寸
|
描述
|
00小时
|
字节
|
数据包大小 (10H)
|
01小时
|
字节
|
保留 (0)
|
02小时
|
单词
|
要传输的块数
|
04 小时
|
双字
|
转移缓冲液
|
08小时
|
四字
|
起始绝对块号 (LBA)
|
INT 13H (0x13)
功能 43H (0x43 或 67) --> 扩展写入 (IBM/MS INT 13H 扩展)
呼叫:AH = 43H
AL = 写入标志(参见
评论)
DL = 驱动器号。
DS:SI = 磁盘地址包
返回:如果函数成功,
进位标志 = 清除
AH = 00H
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
该函数是对磁盘写入函数的扩展,如果函数成功则清除进位标志,AH 寄存器为 00H,否则设置进位标志,AH 返回错误代码。成功将磁盘地址包的块计数字段设置为块数。不同版本的写入标志信息如下表所示:
版本 1.0 和 2.0
|
版本 2.1 及更高版本
|
价值
|
描述
|
价值
|
描述
|
位 0
|
验证写入
|
00H 和 01H
|
不验证写入
|
位 1 至 7
|
保留 (0)
|
02小时
|
写并验证
|
INT 13H (0x13)
功能 44H(0x44 或 68)--> 验证扇区(IBM/MS INT 13H 扩展)
呼叫:AH = 44H
DL = 驱动器号
DS:SI = 磁盘地址包
返回:如果函数成功,
进位标志 = 清除
AH = 00H
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
该函数是 Verify Sectors 函数的扩展。如果函数成功,则清除进位标志,AH 寄存器为 00H,否则设置进位标志,AH 返回错误代码。磁盘地址包的块计数字段成功设置为块数
INT 13H (0x13)
功能 45H(0x45 或 69)--> 锁定/解锁驱动器(IBM/MS INT 13H 扩展)
呼叫:AH = 45H
AL = 操作编号(参见
评论)
DL = 驱动器号
返回:如果函数成功,
进位标志 = 清除
AH = 00H
AL = 锁定状态(00H = 解锁)
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
此功能用于锁定/解锁驱动器。任何编号为 80H 或更高的可移动驱动器都需要支持此功能。驱动器上最多可以放置 255 个锁,并且只有在所有锁都被移除后,媒体才会被物理解锁。
如果函数成功则进位标志被清除并且 AH 寄存器为 00H,否则进位标志被设置并且 AH 返回错误代码。
下表给出了驱动器的不同锁定/解锁操作的操作编号:
价值
|
功能
|
00小时
|
锁定驱动器中的媒体
|
01小时
|
解锁媒体
|
02小时
|
检查锁状态
|
INT 13H (0x13)
功能 46H(0x46 或 70)--> 弹出媒体(IBM/MS INT 13H 扩展)
呼叫:AH = 46H
AL = 00H(保留)
DL = 驱动器号
返回:如果函数成功,
进位标志 = 清除
AH = 00H
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
此功能用于弹出介质。如果功能成功,则清除进位标志,AH 寄存器为 00H,否则设置进位标志,AH 返回错误代码。
INT 13H (0x13)
功能 47H(0x47 或 71)--> 扩展寻道(IBM/MS INT 13H 扩展)
呼叫:AH = 47H
DL = 驱动器号
DS:SI = 磁盘地址包
返回:如果函数成功,
进位标志 = 清除
AH = 00H
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
该函数为 seek 函数的扩展,若函数执行成功则清除进位标志,AH 寄存器为 00H,否则设置进位标志,AH 返回错误码,成功将磁盘地址包的块计数字段设置为块数。
INT 13H (0x13)
功能 48H(0x48 或 72)-->获取驱动器参数(IBM/MS INT 13H 扩展)
呼叫:AH = 48H
DL = 驱动器 (80H-FFH)
DS:SI = 驱动器参数缓冲区
返回:如果函数成功,
进位标志 = 清除
AH = 00H
DS:SI = 缓冲区已填充
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
此函数用于获取驱动器参数。如果函数成功,则清除进位标志,AH 寄存器为 00H,且 DS:SI 为已填充缓冲区,否则设置进位标志,AH 返回错误代码。
INT 13H (0x13)
功能 49H (0x49 或 73) --> 扩展媒体更改 (IBM/MS INT 13H 扩展)
呼叫:AH = 49H
DL = 驱动器号(任何驱动器号,请参阅
评论)
返回:如果媒体没有改变,
进位标志 = 清除
AH = 00H
如果媒体可能已经改变,
进位标志 = 设置
AH = 06H(介质更改错误代码)
评论:
此函数为媒体更改函数的扩展。如果函数成功,则进位标志被清除并且 AH 寄存器为 00H,否则设置进位标志并且 AH 返回错误代码。
该函数与INT 13H的函数AH = 16H的主要区别在于我们可以指定任意驱动器号,其中函数16H只允许软盘驱动器号00H至7FH。
INT 13H (0x13)
功能 4AH(0x4A 或 74)--> 启动磁盘模拟(可启动 CD-ROM)
跟注:AH = 4AH
AL = 00H
DS:SI = 规格包(参见注释中的表格)
返回:如果函数成功,
进位标志 = 清除
如果函数失败,
进位标志 = 设置
AX = 状态代码
评论:
此函数用于启动磁盘仿真。如果函数成功,则清除进位标志,否则设置进位标志,AX 寄存器返回状态代码,驱动器不会处于仿真模式。
可启动 CD-ROM 规范包的格式如下表所示:
抵消
|
尺寸
|
描述
|
00小时
|
字节
|
数据包大小(以字节为单位)(13H)
|
01小时
|
字节
|
启动媒体类型
|
02小时
|
字节
|
驱动器号
驱动器号
|
驱动器描述
|
00小时
|
软盘映像
|
80H
|
可启动硬盘
|
81H 至 FFH
|
无法启动或无模拟
|
|
03小时
|
字节
|
CD-ROM 控制器编号
|
04 小时
|
双字
|
磁盘映像到 Emu 的逻辑块地址
|
08小时
|
单词
|
设备规格
价值
|
描述
|
(IDE)位 0
|
驱动器为从驱动器而非主驱动器
|
(SCSI)位 0 至 7
|
LUN(逻辑单元号)和PUN(物理单元号)
|
位 8 至 15
|
巴士号码
|
|
0AH
|
单词
|
用于缓存 CD-ROM 读取数据的 3Kb 缓冲区段
|
0通道
|
单词
|
加载初始启动映像的段(如果为 0000H,则加载至段 07C0H)
|
0EH
|
单词
|
要加载的512字节虚拟扇区的数量(仅对INT 13H的功能4CH有效)
|
10H
|
字节
|
气缸数低字节(针对 INT 13H 的功能 08H)
|
11H
|
字节
|
扇区数、柱面数的高位(针对 INT 13H 的功能 08H)
|
12 小时
|
字节
|
人数统计(针对 INT 13H 的功能 08H)
|
可启动 CD-ROM 启动媒体类型的位字段如下表所示:
位
|
描述
|
3-0
|
介质类型
价值
|
描述
|
0000
|
无模拟。
|
0001
|
1.2M软盘。
|
0010
|
1.44M软盘。
|
0011
|
2.88M 软盘。
|
0100
|
硬盘(驱动器 C:)
|
其他
|
预订的
|
|
5-4
|
保留 (0)
|
6
|
图像包含 ATAPI 驱动程序
|
7
|
图像包含 SCSI 驱动程序
|
INT 13H (0x13)
功能 4B00H (0x4B00) --> 终止磁盘模拟 (可启动 CD-ROM)
调用:AX = 4B00H
DL = 驱动器号(或 7FH 终止
所有模拟)
DS:SI = 空规范包
返回:如果函数成功,
进位标志 = 清除
如果功能失败,
进位标志 = 设置
AX = 状态代码
DS:SI = 规范包已填充
评论:
此函数用于终止磁盘仿真。如果要终止所有仿真,请调用 DL = 7FH 的函数。如果函数成功,则清除进位标志,否则设置进位标志,AX 寄存器返回状态代码,驱动器仍处于仿真模式。
INT 13H (0x13)
功能 4B01H (0x4B01) --> 获取状态 (可启动 CD-ROM)
调用:AX = 4B01H
DL = 驱动器号
DS:SI = 空规范包
返回:如果函数成功,
进位标志 = 清除
如果功能失败,
进位标志 = 设置
AX = 状态代码
DS:SI = 规范包已填充
评论:
该函数用于获取状态。如果函数成功,则清除进位标志,否则设置进位标志,AX 寄存器返回状态代码
INT 13H (0x13)
功能 4CH(0x4C 或 76)--> 启动磁盘模拟和启动(可启动 CD-ROM)
呼叫:AH = 4CH
AL = 00H
DS:SI = 规范包
返回:如果函数成功,
没有什么
如果功能失败,
进位标志 = 设置
AX = 状态代码
评论:
此函数用于启动磁盘模拟并启动系统。如果函数成功,则不返回任何其他内容,但会设置进位标志,并且 AX 寄存器会返回状态代码。
INT 13H (0x13)
功能 4D00H (0x4D00) --> 返回启动目录 (可启动 CD-ROM)
调用:AX = 4D00H
DS:SI = 命令包(参见
评论)
返回:如果函数成功,
进位标志 = 清除
如果功能失败,
进位标志 = 设置
AX = 状态代码
评论:
此函数用于返回引导目录。如果函数成功,则清除进位标志,否则设置进位标志,AX 寄存器返回状态码。下表给出了“获取引导目录”命令包的可引导 CD-ROM 格式:
抵消
|
尺寸
|
描述
|
00小时
|
字节
|
数据包大小(以字节为单位)(08H)
|
01小时
|
字节
|
要读取的引导目录的扇区数
|
02小时
|
双字
|
引导目录缓冲区
|
06小时
|
单词
|
引导目录中要传输的第一个扇区
|
INT 13H (0x13)
功能 4EH(0x4E 或 78)--> 设置硬件配置(IBM/MS INT 13H 扩展 v2.1)
呼叫:AH = 4EH
AL = 功能编号(参见注释中的表格)
DL = 驱动器号
返回:如果函数成功,
进位标志 = 清除
AH = 00H
如果功能失败,
进位标志 = 设置
AH = 错误代码
AL = 状态
评论:
该函数用于设置硬件配置。下表给出了 AL 调用该函数的函数号:
价值
|
描述
|
00小时
|
启用预取
|
01小时
|
禁用预取
|
02小时
|
设置最大 PIO 传输模式
|
03小时
|
设置PIO模式0
|
04 小时
|
设置默认 PIO 传输模式
|
05小时
|
启用 INT 13H DMA 最大模式
|
06小时
|
禁用 INT 13H DMA
|
DMA 和 PIO 模式是互斥的,因此选择 DMA 会禁用指定设备或该控制器上的所有设备的 PIO,而选择 PIO 会禁用 DMA
INT 13H (0x13)
功能 5001H (0x5001) --> 发送数据包命令 (增强型磁盘驱动器规范 v3.0)
调用:AX = 5001H
DL = 驱动器号
ES:BX = 命令包(参见
评论)
返回:如果函数成功,
进位标志 = 清除
AH = 00H
如果功能失败,
进位标志 = 设置
AH = 错误代码
评论:
此函数用于发送数据包命令。如果函数成功,则清除进位标志,AH 寄存器为 00H,否则设置进位标志,AH 返回错误代码。下表给出了增强型磁盘驱动器规范 v3.0 命令包的格式:
抵消
|
尺寸
|
描述
|
00小时
|
单词
|
签名 B055H
|
02小时
|
字节
|
数据包的长度(以字节为单位)
|
03小时
|
字节
|
保留 (0)
|
04 小时
|
N 个字节
|
格式化的数据包数据
|
INT 13H (0x13)
功能 5501H (0x5501) --> 查询 (Seagate ST01/ST02)
调用:AX = 5501H
DH = 要传输的字节数
DL = 驱动器号
ES:BX = 结果缓冲区
返回
ES:BX缓冲区,填充查询结果。
评论:
此功能用于发送查询。ST01/ST02 BIOS 不会返回此功能的任何成功或失败指示,因此必须假定所有命令都已成功。
ST01/ST02 BIOS 总是将其驱动器映射到前一个 BIOS 驱动器之后,而不会更改 0040H:0075H 处的 BIOS 驱动器计数。此命令与 SCSI 查询命令相同
INT 13H (0x13)
功能 5502H (0x5502) --> 保留 (Seagate ST01/ST02)
INT 13H (0x13)
功能 5503H (0x5503) --> 设置 DTQ (设备类型限定符) (Seagate ST01/ST02)
调用:AX = 5503H
DH = DTQ 字节(见
评论)
DL = 驱动器号
返回:无
评论:
此函数用于设置 DTQ(设备类型限定符)。此函数不返回任何内容。DTQ 字节的位字段如下表所示:
位
|
描述
|
0
|
存在 Seagate 安装软件
|
1
|
选定的驱动器已安装
|
2
|
主机适配器检查所选驱动器上的奇偶校验
|
3
|
选定的驱动器是ST225N
|
4
|
所选驱动器已配对 ST225N/NP
|
5
|
预订的
|
6
|
已连接 SCSI 驱动器
|
7
|
预订的
|
INT 13H (0x13)
功能 5504H (0x5504) --> 返回标识 (Seagate ST01/ST02)
调用:AX = 5504H
DL = 驱动器号
返回:
AX = 4321H
BL = 选定的驱动器号(00H,01H)
BH = 连接到主机的驱动器数量
适配器
评论:
函数用于返回驱动器的标识。
INT 13H (0x13)
功能 5505H (0x5505) --> 停放头 (Seagate ST01/ST02)
调用:AX = 5505H
DL = 驱动器号
DH = 子功能(参见注释)
返回:
没有什么
评论:
此功能用于停放磁盘磁头。它用于旧硬盘,但现代硬盘不需要任何外部程序来停放磁头。
子功能 00H 使磁盘的磁头停放(SCSI 停止命令),子功能 01H 使磁盘的磁头取消停放(SCSI 启动命令)。
INT 13H (0x13)
功能 5506H (0x5506) --> SCSI 总线奇偶校验 (Seagate ST01/ST02)
调用:AX = 5506H
DL = 驱动器号
DH = 子功能编号(见
评论)
返回:
AL = 状态 (00H 奇偶校验
禁用,01H 奇偶校验启用)
评论:
使用以下 DH 子功能编号调用该功能:
价值
|
描述
|
00小时
|
禁用奇偶校验
|
01小时
|
启用奇偶校验
|
02小时
|
返回当前奇偶校验设置
|
INT 13H (0x13)
功能 5507H (0x5507) 至功能 550DH (0x550D) --> 保留功能 (Seagate ST01/ST02)
调用:AX = 5507H 至 AX = 550DH
评论:
这些功能已被正式列为“保留”
INT 13H (0x13)
函数 A0H(0xA0 或 160)--> 获取常驻代码段(Super PC-Kwik v3.20 及更高版本)
调用方式:AH = A0H
如果 = 4358H
返回:
AX = 居民代码段
评论:
此函数用于获取常驻代码段。AX返回常驻代码的段。
INT 13H (0x13)
功能 A1H(0xA1 或 161)--> 刷新缓存(Super PC-Kwik v3.20 及更高版本)
跟注:AH = A1H
如果 = 4358H
返回:
进位标志 = 清除
AH = 00H (v5.10)
评论:
该函数用于刷新缓存。
INT 13H (0x13)
功能 A3H(0xA3 或 163)——> 禁用缓存(Super PC- Kwik v3.20 及更高版本)
跟注:AH = A3H
如果 = 4358H
返回:
进位标志 = 清除
评论:
该函数用于禁用缓存。
INT 13H (0x13)
功能 A4H(0xA4 或 164)--> 启用缓存(Super PC-Kwik v3.20 及更高版本)
跟注:AH = A4H
如果 = 4358H
返回:
进位标志 = 清除
评论:
该函数用于启用缓存。
INT 13H (0x13)
功能 EEH(0xEE 或 238)--> 设置 1024 柱面标志(SWBIOS)
呼叫:AH = EEH
DL = 驱动器号
返回:
进位标志 = 清除
AH = 00H
评论:
该函数用于设置 1024 – 柱面标志。除 AH=EEH 和 AH=EFH 外,所有 INT 13H 调用都会清除该标志。磁盘管理器也支持这些调用。对于支持该调用的软件,该函数相当于使用 CX=0400H 调用函数 AH=EFH。
HyperDisk v4.01 及更高版本和 PC-Cache v5.5 及更高版本也支持此功能,以允许使用 SWBIOS 缓存驱动器以访问超过 1024 个柱面。
INT 13H (0x13)
功能 EFH(0xEF 或 239)--> 设置气缸偏移(Ontrack Drive Rocket)
呼叫:AH = EFH
CX = 下一个 INT 13H 调用的柱面偏移量
DL = 驱动器号
返回:
进位标志 = 清除
AH = 00H
评论:
该函数用于设置柱面偏移。对于支持此调用的软件,函数 AH=EEH 相当于使用 CX=0400H 调用此函数。除 AH=EEH 和 AH=EFH 外,所有调用的 INT 13H 都会将柱面偏移重置为 0。
INT 13H (0x13)
功能 F9H(0xF9 或 249)--> 安装检查(SWBIOS)
跟注:AH = F9H
DL = 驱动器号
返回:如果函数成功,
进位标志 = 清除
DX = 配置字(参见注释)
如果功能失败,
进位标志 = 设置
评论:
此功能用于安装检查。如果功能成功,则清除进位标志,DX 返回配置字,否则设置进位标志。
如果有其他 SWBIOS 扩展可用,则设置位 15。磁盘管理器也支持这些调用。
INT 13H (0x13)
功能 FEH(0xFE 或 254)--> 获取扩展柱面数 (SWBIOS)
呼叫:AH = FEH
DL = 驱动器号
返回:
进位标志 = 清除
DX = 1024 以上的柱面数
在驾驶中
评论:
此函数用于获取扩展的柱面数。INT 13H 的函数 AH = 08H 将返回截断为 1024 的柱面数。没有此扩展的 BIOS 将返回计数模 1024。磁盘管理器也支持这些调用
INT 13H (0x13)
函数 FFH(0xFF 或 255)——> 官方私有函数(IBM SurePath BIOS)
INT 13H (0x13)
功能 FFFFH (0xFFFF) --> 设置 Turbo 模式 (UNIQUE UX Turbo 实用程序)
调用:AX = FFFFH
BH=AAH
BL = 子功能编号(见表格
在评论中)
返回:如果已安装,
AX = 1234H
评论:
该函数用于设置Turbo模式。使用BL调用该函数的子函数号如下表所示:
价值
|
描述
|
00小时
|
安装检查
|
01小时
|
开启 Turbo 模式
|
02小时
|
关闭 Turbo 模式
|
03小时
|
根据硬件开关设置Turbo模式
|
04 小时
|
将磁盘访问设置为 Turbo 模式
|
05小时
|
将磁盘访问设置为正常模式
|
如何在 C 编程中使用 INT 13H 扩展
我们可以使用前面章节中使用的相同 C 函数(int86()、int86x() 等)来调用 INT 13H 的扩展函数。让我们通过一个例子来学习它。
以下示例重点介绍三个函数(检查扩展是否存在、扩展读取和扩展写入)。但是,本章中我们不打算使用扩展写入函数。
程序首先检查是否支持扩展,如果扩展存在于 INT 13H,则读取磁盘的绝对扇区 0(即 MBR)。程序的编码按以下方式进行:
/* 使用 INT 13 BIOS 扩展访问超过 8.46 GB 的扇区的程序 */
#include<stdio.h>
#include<dos.h>
/* 将标识符分配给数据类型 */
typedef 无符号字符字节;
typedef 无符号整型字;
typedef 无符号长整型 DWord;
/* disk_packet 结构加载到 DS:SI 中并执行命令 */
磁盘包结构
{
Byte size_pack; //数据包的大小必须为16或16+
字节保留1;//保留
Byte no_of_blocks;// 传输的块数
字节保留2; //保留
/* 段地址:偏移格式 */
Word offset; //偏移地址
Wordsegment;//段地址
/* 支持容量为 1152921504.607 GB 的磁盘 */
双字 lba1;
双字 lba2;
}
磁盘包;
/* 用于检查扩展是否受支持的函数 */
无效 check_ext_present()
{
union REGS inregs, outregs; /*输入寄存器和
输出 */
inregs.h.ah=0x41; /* 要检查的函数
扩展存在 */
在注册表中.x.bx=0x55AA;
inregs.h.dl=0x80; /* 第一个硬盘的驱动器号 */
int86(0x13,&inregs,&outregs); /*调用中断*/
如果(outregs.x.cflag)
{
/* 不支持扩展 */
printf("\nBios扩展不受支持");
退出(1);
}
如果(outregs.x.bx==0xAA55)
如果(outregs.x.cx&0x1)
/* 扩展存在 */
printf("\n支持扩展I/O");
}
/* 读取扇区的函数 */
void read_sectors(void *缓冲区)
{
union REGS inregs, outregs; /* 输入和输出
寄存器 */
struct SREGS segregs; //段寄存器
disk_pack.size_pack=16; // 将大小设置为 16
disk_pack.no_of_blocks=1; // 一个块
disk_pack.reserved1=0; //保留字
disk_pack.reserved2=0; //保留字
disk_pack.segment=FP_SEG(buffer);// 缓冲区的段
disk_pack.offset=FP_OFF(buffer); //缓冲区的偏移量
/* 请求硬盘 1 的 MBR */
/* 读取绝对扇区 0 */
disk_pack.lba1=0; /* LBA 地址,包含第一个
32 位 */
/* 我们通常需要(驱动器<2.1 TB)来设置
只有这个 */
disk_pack.lba2=0; //最后 32 位地址
inregs.h.ah=0x42; //读取函数
inregs.h.dl=0x80; // 第一个硬盘的驱动器号 inregs.x.si = FP_OFF(&disk_pack); /*使 DS:SI 指向
到磁盘包 */
复制代码
/* 调用中断 */
int86x(0x13,&inregs,&outregs,&segregs);
如果(outregs.x.cflag)
printf("\n\n错误 %d\n",outregs.h.ah);
别的
printf("\n\n我希望一切都好");
}
//// 写入扇区函数\\\\
无效写入扇区()
{
/* 它的写入方式与 read_sectors 函数相同,但函数编号除外,该函数中的函数编号为 0x43。我们将在下一章中讨论扩展写入函数。
在使用此功能之前,请检查并确认您要做什么。您应该对要做的事情有适当的了解。在缺乏知识或粗心大意的情况下使用此功能可能会破坏您的数据。*/
}
/// 主要功能 \\\
空主()
{
int i=0;
/* 保存 MBR 的缓冲区 */
字节mbr[512];
clrscr();
/* 检查 BIOS 扩展是否存在 */
检查外部存在();
/* 读取扇区 */
读取扇区(&mbr);
printf("\n\n MBR 的数据 \n");
printf("▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀\n\n\n");
while(i++<512)
{
/* 显示 MBR 缓冲区 */
printf("%c",mbr[i]);
}
}
MBR数据
对程序编码的评论
typedef 将标识符分配给数据类型,例如 typedef unsigned char Byte; 为数据类型 char 分配标识符 Byte。同样,标识符 Word 分配给 int,DWord 分配给 long。
将 disk_packet 结构加载到 DS:SI 中,并执行命令(例如扩展读取、扩展写入或验证等)。请参阅前面给出的 IBM/MS INT 13H 扩展功能(功能 41H 至功能 49H)。
check_ext_present() 函数检查扩展是否可用/受支持。该函数使用 BX=55AAH (inregs.x.bx=0x55AA;) 调用,如果支持扩展,则 BX 寄存器设置为 AA55H。(参见前面给出的函数 41H)
函数 read_sectors 用于读取磁盘的绝对扇区,由 disk_pack.lba1 指定。在此程序中,我们已指定 disk_pack.lba1=0,因此我们将读取绝对扇区 0(参见下面的注释),从而读取磁盘的 MBR。
write_sector 函数与 read_sectors 函数相同,编写方式相同,但函数选项不同。我们将在下一章中使用它。
笔记:
我们通过以下两种方式读取磁盘扇区:
- 相对扇区读取(或写入)
- 绝对扇区读取(或写入)
在相对扇区读取中,我们根据磁盘的 CHS(柱面、磁头和扇区)几何结构读取磁盘扇区。在相对扇区读取中,磁盘的 MBR(磁盘的第一个扇区)位于柱面 0、磁头 0 和扇区 1。
在绝对读取磁盘扇区时,我们不需要在我们的程序中指定柱面或磁头编号。绝对扇区从绝对扇区 0 开始计算。
因此,如果我们要读取磁盘的 MBR(磁盘的第一个扇区),我们将读取绝对扇区 0。BIOS 的工作是将绝对扇区号转换为其对应的柱面、磁头和扇区号。
与绝对扇区读取(或写入)一样,在整盘读取或写入等操作中,我们只需要计算循环内的绝对扇区;而相对扇区读取(或写入)时,我们需要一次运行三个循环来计算 CHS,因此绝对扇区读取/写入比相对扇区读取/写入快得多。
例如,如果我们有任何具有 16 个磁头(面)、12 个柱面和 63 个扇区的硬盘,下表显示了两种读取方法的过程和差异,从而显示了绝对扇区方法如何使我们的程序(例如整个磁盘读取/写入或整个磁盘擦除程序等)运行得更快:
相对扇区读数
|
绝对扇区读数
|
圆柱 =0,磁头 =0,扇区 = 1
|
绝对扇区 = 0
|
圆柱 =0,磁头 =0,扇区 = 2
|
绝对扇区 = 1
|
圆柱 =0,磁头 =0,扇区 = 3
|
绝对扇区 = 2
|
。
。
。
。
|
。
。
。
。
|
柱面 =0,磁头 =0,扇区 = 62
|
绝对扇区 = 61
|
柱面 =0,磁头 =0,扇区 = 63
|
绝对扇区 = 62
|
柱面 =0,磁头 =1,扇区 = 1
|
绝对扇区 = 63
|
柱面 =0,磁头 =1,扇区 = 2
|
绝对扇区 = 64
|
柱面 =0,磁头 =1,扇区 = 3
|
绝对扇区 = 65
|
柱面 =0,磁头 =1,扇区 = 4
|
绝对扇区 = 66
|
。
。
。
。
|
。
。
。
。
|
柱面 =0,磁头 =1,扇区 = 63
|
绝对扇区 = 125
|
柱面 =0,磁头 =2,扇区 = 1
|
绝对扇区 = 126
|
柱面 =0,磁头 =2,扇区 = 2
|
绝对扇区 = 127
|
柱面 =0,磁头 =2,扇区 = 3
|
绝对扇区 = 128
|
。
。
。
。
|
。
。
。
。
|
柱面 =0,磁头 =15,扇区 = 63
|
绝对扇区 = 1007
|
柱面 =1,磁头 =0,扇区 = 1
|
绝对扇区 = 1008
|
柱面 =1,磁头 =0,扇区 = 2
|
绝对扇区 = 1009
|
柱面 =1,磁头 =0,扇区 = 3
|
绝对扇区 = 1010
|
。
。
。
。
|
。
。
。
。
|
柱面 =1,磁头 =0,扇区 = 63
|
绝对扇区 = 1070
|
圆柱 =1,磁头 =1,扇区 = 1
|
绝对扇区 = 1071
|
柱面 =1,磁头 =1,扇区 = 2
|
绝对扇区 = 1072
|
圆柱 =1,磁头 =1,扇区 = 3
|
绝对扇区 = 1073
|
。
。
。
。
|
。
。
。
。
|
柱面 = 1,磁头 = 15,扇区 = 63
|
绝对部门 = 2015 年
|
柱面 =2、磁头 =0、扇区 =1
|
绝对部门 = 2016 年
|
柱面 =2、磁头 =0、扇区 =2
|
绝对部门 = 2017 年
|
柱面 =2、磁头 =0、扇区 =3
|
绝对部门 = 2018 年
|
。
。
。
。
|
。
。
。
。
|
圆柱 = 11,磁头 = 15,扇区 = 60
|
绝对扇区 = 12092
|
圆柱 = 11,磁头 = 15,扇区 = 61
|
绝对扇区 = 12093
|
圆柱 = 11,磁头 = 15,扇区 = 62
|
绝对扇区 = 12094
|
圆柱 = 11,磁头 = 15,扇区 = 63
|
绝对扇区 = 12095
|
以下是任何 MBR 分析工具在磁盘上显示的有关 MBR 分区表的信息:
由磁盘上的任何 MBR 分析工具显示
以上信息中,两个分区起始的相对扇区号分别为63和11277630,它们不受分区影响,是根据磁盘上可用的扇区数来计算的。