跳转至内容

MS-DOS 7 系统编程入门 / 附录

来自维基教科书,开放的书籍,为开放的世界

附录

A.01 PC 的主要数据结构

[编辑 | 编辑源代码]

BIOS 和 DOS 都会将其重要数据存储在计算机内存中专门分配的区域。这些区域内的数据位置并非固定不变,可能会根据 BIOS 和 DOS 的版本而有所不同。因此,不应直接寻址系统结构中的数据,而应通过本书第 8 章中描述的特殊函数访问。另一个原因是,除非调用相应的服务函数,否则无法正确更新数据。

然而,可能需要直接访问系统数据结构。这使您能够获得比通过服务函数允许知道的更多信息。出于调试目的,您可能需要查看数据“本来面目”,而不进行更新。您可能需要进行干预,更改某些设置以引发所需的后果。当然,任何此类操作均完全由您自行承担风险,但它可能为您提供其他情况下无法获得的机会。

A.01-1. BIOS 数据区

[编辑 | 编辑源代码]

当计算机开机时,其 BIOS 系统开始收集数据并整理其数据区域。在与 AT 兼容的计算机中,BIOS 数据区域占用 0040:0000h–0040:00FFh 处的 100h 字节。下表给出了选定数据项的一般分配情况,并参考了软盘驱动器 (A.08-1)、视频系统 (A.10-6)、键盘 (A.02-3) 和其他硬件 (A.11-1) 的单独数据表。

偏移量 大小 描述
00h 2 COM-1 端口基本 I/O 地址
02h 2 COM-2 端口基本 I/O 地址
08h 2 LPT-1 端口基本 I/O 地址
0Eh 2 辅助 BIOS 数据段 (如果不存在则为 0000h)
10h 2 已安装硬件字 (A.11-1)
12h 1 POST 自检状态
13h 2 基本内存大小(以千字节为单位)
17h 39 键盘的缓冲区和标志 (A.02-3)
3Eh 7 软盘驱动器状态寄存器 (A.08-1)
49h 22 当前视频模式数据 (A.10-6)
67h 4 CPU 重置后的重启地址 [注释 4 到 A.12-1]
6Ch 4 计时器滴答声,从午夜开始计数
70h 1 天数,在 INT 1A\AH=00h 调用后重置
71h 1 Ctrl-Break 键按下后设置位 7
72h 2 POST 测试的规定操作 [注释 1]
74h 1 硬盘的最后一次操作错误代码 (A.06-01)
75h 1 硬盘驱动器数量
77h 1 硬盘驱动器 I/O 端口地址
78h 1 LPT-1 端口超时计数器
7Ch 1 COM-1 端口超时计数器
7Dh 1 COM 2 端口超时计数器
80h 4 键盘缓冲区的起始和结束偏移量 (A.02-3)
84h 8 视频控制寄存器 (A.10-6)
8Ch 3 硬盘控制器状态寄存器
8Fh 7 软盘控制器信息 (A.08-1)
96h 2 键盘状态字节 (A.02-3)
98h 4 指向等待完成标志的指针 (INT 15\AX=8300h)
9Ch 4 计时器的等待计数(以微秒为单位)
A0h 1 系统计时器标志
位 0:已发生 INT 15\AH=86h 的调用
位 7:等待时间已过
CEh 2 自上次启动以来的天数
F0h 16 应用程序间通信区域
注释
  1. ^ a b 重新启动后,由跳转到 F000:FFF0h 地址远跳转启动,[注释 4 到 A.12-1] POST 测试性能取决于 0040:0072h 内存单元中保存的内容。
    0000h – “冷”启动(带内存测试的完整 POST)
    1234h – “热”启动(绕过内存测试)
  2. 由于 BIOS 数据区域中的数据分配可能取决于 BIOS 版本,因此由您来决定在特定偏移量处的数据项是否确实是您预期在该处找到的项。

A.01-2 DOS 列表中的选定条目

[编辑 | 编辑源代码]

列表是 IO.SYS 加载程序在 DOS 加载过程开始时创建的基本数据结构。指向 DOS 列表的第一个字节的指针由 INT 21\AH=52h 函数 (8.02-59) 返回。图 10(在附录 A.03-3 中)说明了访问列表的过程。以下表格给出了有关 DOS 列表中的数据项的选定信息。

偏移量 大小 描述
– 02h 2 第一个 MSB 的段地址 (A.12-7)
00h 4 指向第一个 DPB 块的指针 [注释 1]
04h 4 指向 SFT(系统文件表,A.01-4)的指针
0Ch 4 指向活动 CON(控制台)设备驱动程序的指针
10h 2 任何驱动器上的每个扇区的最大字节数
16h 4 指向 CDS 结构中的第一条记录的指针 (A.03-3)
20h 1 已注册驱动器(块设备)的数量
21h 1 CDS 结构中记录的数量 (A.03-3)
22h 18 实际的 NUL 设备驱动程序头 [注释 2]
34h 1 由 JOIN.EXE 创建的虚拟驱动器数量
37h 4 指向 SETVER 表的指针 (如果不存在则为 0000:0000h)
3Dh 2 最后执行程序的 PSP 段
43h 1 引导驱动器 (01h = A:,03h = C:,依此类推)
45h 2 扩展内存大小(以千字节为单位)。
注释
  1. ^ DPB 块(驱动器参数块,A.03-1)按链式排列,因此指向下一个 DPB 的指针位于前一个 DPB 中的偏移量 19h 处。
  2. ^ 偏移量 22h 处的 NUL 设备驱动程序头是驱动程序头链中的第一个。每个头中的第一个双字是指向下一个头的指针。另一种获取指向第二个驱动程序头的指针的方法是通过 INT 2F\AX=122Ch。链中的最后一个头以双字 FFFFh 开头。

A.01-3. DOS 可交换数据区域中的选定项目

[编辑 | 编辑源代码]

DOS 可交换数据区域 (SDA) 的当前地址和大小由 INT 21\AX=5D06h 函数 (8.02-70) 返回。SDA 存储不断更新的数据,包括主要的 DOS 系统堆栈。这些数据反映了每个当前时刻不断变化的 DOS 状态。可交换区域的总大小可能高达几千字节,具体取决于堆栈的大小。

SDA 区域被称为“可交换”,因为其交换是获取 DOS 可重入性的主要机制,即 TSR 和处理程序调用 DOS 函数的机会,而这些 TSR 和处理程序本身可以在之前 DOS 函数的执行尚未完成时被调用。如果中断处理程序发现关键错误标志(在 SDA 中的偏移量 00h 处)或 InDOS 标志(在 SDA 中的偏移量 01h 处)具有非零值,则此处理程序的调用已中断 DOS 函数的执行,然后对任何 DOS 函数的下一个调用都可能更改 SDA 区域中的数据,从而使返回到被中断程序的正确恢复变得不可能。虽然有时可以恢复被中断的程序 (8.02-28, 8.02-87),但最彻底的解决方案是在调用任何 DOS 函数之前保存 SDA 的内容,并在之后根据保存的数据恢复 SDA 状态。还应考虑到 INT 21\AX=5D06h 函数本身 (8.02-70) 不可重入;因此,应该在处理程序初始化期间预先进行对 SDA 地址的调用,以便在中断时,处理程序可以读取准备好的 SDA 地址,而无需对 INT 21\AX=5D06h 进行新的调用。

下表显示了可交换数据区域中的选定数据项

偏移量 大小 描述
00h 1 关键错误标志(“ErrorMode”)
01h 1 InDOS 标志 (INT 21\AH=34h,8.02-28)
02h 1 导致关键错误的驱动器,如果无错误则为 FFh
03h 1 最后一次错误的位置 (A.06-4)
04h 2 最后一次错误的扩展代码 (A.06-1)
06h 1 最后一次错误后的建议操作 (A.06-3)
07h 1 最后一次错误的类别 (A.06-2)
08h 4 最后一次错误发生时的 ES:DI 指针
0Ch 4 DTA 的当前地址 (8.02-16)
10h 2 当前程序的 PSP 段(进程标识符)
14h 2 来自上次程序终止的错误级别值
16h 1 当前逻辑磁盘号
17h 1 BREAK 标志 (3.01, 4.02, 8.02-25)
2Ah 1 对 INT 24 (8.02-84) 调用的 FAIL 响应标志
2Bh 1 允许的 INT 24 操作 (8.02-84)
30h 1 月日
31h 1 月份
32h 2 年份,从 1980 年开始计数
34h 2 自 1980-01-01 以来的天数
36h 1 星期几 (0 = 星期日)

A.01-4 系统文件表结构

[编辑 | 编辑源代码]

访问句柄与其对应的“打开”对象之间的关联由 DOS 存储在一个表链队列中,称为 SFT(系统文件表)。这个名称并不完全正确,因为“打开”的对象可能不仅仅是文件,还可能是分配的 XMS 区域、驱动程序的访问通道和其他称为“字符设备”的对象。

指向第一个 SFT 的指针位于列表中的偏移量 04h 处 (A.01-2)。每个 SFT 从偏移量 00h 处开始,其中包含一个指向下一个 SFT 的双字指针,除了最后一个 SFT,它在偏移量 00h 处用双字 FFFFh 标记。这种结构可以很容易地从第一个 SFT 跟踪到最后一个 SFT。每个 SFT 中偏移量 04h 处的一个字声明了此特定 SFT 中条目的数量。每个条目对应于一个“打开”的对象。SFT 条目的总数受 CONFIG.SYS 文件中的 FILES 规范限制 (4.12)。

“打开”到给定程序的 SFT 条目的数量存储在该程序所属的 PSP (A.07-1) 中的偏移量 18h 处的 JFT 中。对应的“打开”对象使用句柄进行寻址 (INT 21\AH=3Dh,8.02-33),这些句柄根据其在 JFT 中的数字的分配顺序来识别 SFT 条目。与给定句柄对应的 SFT 条目的编号也可以通过 INT 2F\AX=1220h (8.03-11) 找到。然后,INT 2F\AX=1216h 函数 (8.03-09) 在给出 SFT 条目编号的情况下,返回指向该条目的指针。有关活动 SFT 条目和对应对象的某些信息可以通过 INT 21\AX=4400h 函数 (8.02-40) 获得。

前三个 SFT 条目编号具有固定的默认关联:00h – AUX 通道 (COM1 端口),01h – CON 设备(控制台),02h – PRN 设备 (LPT1 端口)。这 3 个 SFT 条目编号会自动写入每个程序的 JFT 表中。它们在 JFT 中的分配顺序 (01h, 01h, 01h, 00h, 02h) 定义了关联的句柄:0000h – 用于 STDIN 通道,0001h – 用于 STDOUT 通道,0002h – 用于 STDERR 通道,0003h – 用于 COM1 端口,0004h – 用于 LPT1 端口。句柄 0005h 及更高的 SFT 条目是在 INT 21\AH=3Dh (8.02-33) 和 INT 21\AX=6C00h (8.02-78) 函数的请求下创建的。

每个 SFT 表的第一项从偏移量 06h 开始。由于每个项都有固定的长度 3Bh,因此可以轻松计算出后续项的起始位置。下表指定了每个项中选定的数据项,偏移量从该项的起始位置算起。表的第一个列 "CDE" 对应于 "字符设备" 项,第二列 "OFE" 对应于与普通文件关联的项。

CDE OFE 大小 描述
00h 00h 2 指向对象的句柄数(无则为 FFFFh)
02h 02h 1 访问和共享条件 (A.09-4)
  03h 1 标志 [注释 1]
  04h 1 文件的属性 (A.09-2)
05h 05h 2 对象的信息字(文件为 A.04-2,其他为 A.05-2)
07h 07h 4 指向文件的 DPB (A.03-1) 或者指向其他对象的驱动程序头 (A.05-1)
  0Bh 2 起始簇号(仅限本地文件)
  0Dh 2 文件的打包时间 (INT 21\AX=5700h, 8.02-63)
  0Fh 2 文件的打包日期 (INT 21\AX=5700h, 8.02-63)
  11h 4 文件的大小
  15h 4 文件的指针位置 (INT 21\AH=42h, 8.02-38)
  19h 2 上次访问簇的相对编号
19h   4 指向 IFS 重定向记录的指针
  1Bh 4 包含文件项的目录扇区的编号
  1Fh 1 文件项在目录扇区中的编号
20h 20h 11 文件或其他对象的 FCB 格式名称 (A.09-5)
  31h 2 文件所有者进程的标识符(PSP 段)
  35h 2 上次访问簇的绝对编号
37h   4 指向 IFS 驱动程序的指针,普通文件为 0000:0000h
注释
  1. ^ 03h 处的标志字节包含 INT 21\AX=6C00h 函数 (8.02-78) 指定的所有 BH 寄存器设置。此外,标志字节中位 7 的状态标记通过 FCB 打开的文件。

A.02 键盘代码和国家/地区适配

[edit | edit source]

A.02-1 键代码

[edit | edit source]

即使在操作系统尚未加载时,也必须始终启用用户通过键盘控制 PC。因此,主板的硬件和 BIOS 系统负责与不同类型的键盘兼容。当 PC 开启时,其 BIOS 系统加载 INT 09 和 INT 16 处理程序,提供各种键盘功能。

键盘信号由键盘控制器接收并转换。它对每个按键状态变化(按下或释放)做出响应,为端口 60h 准备代码,并通过 IRQ 01 中断请求线发送请求。请求调用 INT 09 处理程序。某些键会导致键盘控制器发送一系列代码,从而多次调用 INT 09 处理程序。INT 09 处理程序从端口 60h 读取的代码通常是某个键的扫描码,但它也可能是服务代码。从 E0h 到 FFh,以及 00h 和 AAh 的代码被解释为服务代码。负责特殊按键识别任务的服务代码称为前缀

E0h - 用于区分那些为了与过时的 84 键键盘兼容而被赋予相同扫描码的键。
E1h - 用于具有双字节扫描码的键。在普通键盘中,只有一个这样的键:Pause/Break。[注释 6]

从端口 60h 读取前缀会使 INT 09 处理程序准备好对即将接收到的扫描码进行特定解释,该扫描码将在下次调用 INT 09 时接收。在下表中,第二列(INT 09)显示了 INT 09 处理程序从端口 60h 读取的按键的十六进制扫描码。表中没有显示按键释放代码,因为可以很容易地通过设置按键扫描码的第 7 位来推导出释放代码。例如,键 "A" 发送按键(按下)代码 1Eh,因此它的释放代码是 9Eh。但是,那些在 E0h 或 E1h 前缀之后发送的扫描码将与该前缀一起显示在表的第二列中。当然,相同键的释放代码也以相同的前缀开头。

从端口 60h 读取的 "原始" 扫描码由 INT 09 和 INT 16 处理程序转换为一对新的数据 - 统一扫描码和 ASCII 值,分别对应于按下的(或释放的)键。只有这组数据对将被通过 INT 16 发送键盘输入请求的程序呈现。统一扫描码通常等于按下扫描码,但如果同时按下 "功能" 键,则可能会改变:SHIFT、CTRL 或 ALT。每个 "功能" 键都有自己的扫描码(在下表的第二列中)。INT 09 处理程序会考虑 "功能" 键的扫描码,但不会将其存储在键盘缓冲区中。 "功能" 键的状态通过 INT 16\AH=12 函数 (8.01-85) 返回的状态字来表示。下表表示最常用的 104 键 "增强" 键盘的键。表中第一列的键名之前的 "num" 表示键盘右侧的数字小键盘的键。显示的这些键的代码对应于 NUMLOCK 开关的关闭状态。[注释 6] 数据顺序由第二列中键的扫描码值定义。

下表中第 3-6 列的十六进制数字表示 INT 16\AH=10h 函数 (8.01-83) 在 AX 寄存器中返回的数据。每个数字的左边两位定义了在 AH 寄存器中返回的统一扫描码,右边两位定义了在 AL 寄存器中返回的相应字符的 ASCII 码。第 3 列(AX)中的数据对应于没有同时按下任何 "功能" 键的按键。第 4 列(SHIFT)中的数据对应于按下 SHIFT 键的情况,第 5 列(CTRL)中的数据对应于按下 CTRL 键的情况,第 6 列(ALT)中的数据对应于按下 ALT 键的情况。任何特定值的空白表示相应的键或键组合由 BIOS 感知,但不会通过 INT 16 处理程序报告。

INT09 AX SHIFT CTRL ALT 注释
Esc 01 011B 011B 011B 0100 [注释 1]
1 ! 02 0231 0221   7800
2 @ 03 0332 0340 0300 7900
3 # 04 0433 0423   7A00
4 $ 05 0534 0524   7B00
5 % 06 0635 0625   7C00
6 ^ 07 0736 075E 071E 7D00
7 & 08 0837 0826   7E00
8 * 09 0938 092A   7F00
9 ( 0A 0A39 0A28   8000
0 ) 0B 0B30 0B29   8100
_ 0C 0C2D 0C5F 0C1F 8200
= + 0D 0D3D 0D2B   8300
Backspace 0E 0E08 0E08 0E7F 0E00 [注释 1]
Tab 0F 0F09 0F00 9400 A500 [注释 1][注释 2]
Q 10 1071 1051 1011 1000
W 11 1177 1157 1117 1100
E 12 1265 1245 1205 1200
R 13 1372 1352 1312 1300
T 14 1474 1454 1414 1400
Y 15 1579 1559 1519 1500
U 16 1675 1655 1615 1600
I 17 1769 1749 1709 1700
O 18 186F 184F 180F 1800
P 19 1970 1950 1910 1900
[ { 1A 1A5B 1A7B 1A1B 1A00 [注释 1]
] } 1B 1B5D 1B7D 1B1D 1B00 [注释 1]
Enter 1C 1C0D 1C0D 1C0A 1C00 [注释 1]
num Enter E0 1C E00D E00D E00A A600 [注释 1][注释 3]
Left Ctrl 1D         [注释 4]
Right Ctrl E0 1D         [注释 4]
A 1E 1E61 1E41 1E01 1E00
S 1F 1F73 1F53 1F13 1F00
D 20 2064 2044 2004 2000
F 21 2166 2146 2106 2100
G 22 2267 2247 2207 2200
H 23 2368 2348 2308 2300
J 24 246A 244A 240A 2400
K 25 256B 254B 250B 2500
L 26 266C 264C 260C 2600
; : 27 273B 273A   2700 [注释 1]
' " 28 2827 2822   2800 [注释 1]
` ~ 29 2960 297E   2900 [注释 1]
Left Shift 2A         [注释 4]
SysRq E0 2A     7200   [注释 5]
\ | 2B 2B5C 2B7C 2B1C 2B00 [注释 1]
Z 2C 2C7A 2C5A 2C1A 2C00
X 2D 2D78 2D58 2D18 2D00
C 2E 2E63 2E43 2E03 2E00
V 2F 2F76 2F56 2F16 2F00
B 30 3062 3042 3002 3000
N 31 316E 314E 310E 3100
M 32 326D 324D 320D 3200
, < 33 332C 333C   3300 [注释 1]
. > 34 342E 343E   3400 [注释 1]
/ ? 35 352F 353F   3500 [注释 1]
num / E0 35 E02F E02F 9500 A400 [注释 1][注释 2][注释 3]
Right Shift 36         [注释 4]
num * 37 372A 372A 9600 3700 [注释 1][注释 2]
Left Alt 38         [注释 4]
Right Alt E0 38         [注释 4]
Spacebar 39 3920 3920 3920 3920
Caps Lock 3A         [注释 4]
F1 3B 3B00 5400 5E00 6800
F2 3C 3C00 5500 5F00 6900
F3 3D 3D00 5600 6000 6A00
F4 3E 3E00 5700 6100 6B00
F5 3F 3F00 5800 6200 6C00
F6 40 4000 5900 6300 6D00
F7 41 4100 5A00 6400 6E00
F8 42 4200 5B00 6500 6F00
F9 43 4300 5C00 6600 7000
F10 44 4400 5D00 6700 7100
NumLock 45         [注释 4]
Pause E1 1D 45         [注释 4][注释 6]
ScrollLock 46         [注释 4]
数字键 7 47 4700 4737 7700 0007 [注释 7]
Home E0 47 47E0 47E0 77E0 9700 [注释 1][注释 3]
数字键 8 48 4800 4838 8D00 0008 [注释 2][注释 7]
向上箭头 E0 48 48E0 48E0 8DE0 9800 [注释 1][注释 2][注释 3]
数字键 9 49 4900 4939 8400 0009 [注释 7]
PgUp E0 49 49E0 49E0 84E0 9900 [注释 1][注释 3]
数字键 - 4A 4A2D 4A2D 8E00 4A00 [注释 1][注释 2]
数字键 4 4B 4B00 4B34 7300 0004 [注释 7]
向左箭头 E0 4B 4BE0 4BE0 73E0 9B00 [注释 1][注释 3]
数字键 5 4C 4C00 4C35 8F00 0005 [注释 2][注释 7]
数字键 6 4D 4D00 4D36 7400 0006 [注释 7]
向右箭头 E0 4D 4DE0 4DE0 74E0 9D00 [注释 1][注释 3]
数字键 + 4E 4E2B 4E2B 9000 4E00 [注释 1][注释 2]
数字键 1 4F 4F00 4F31 7500 0001 [注释 7]
End E0 4F 4FE0 4FE0 75E0 9F00 [注释 1][注释 3]
数字键 2 50 5000 5032 9100 0002 [注释 2][注释 7]
向下箭头 E0 50 50E0 50E0 91E0 A000 [注释 1][注释 2][注释 3]
数字键 3 51 5100 5133 7600 0003 [注释 7]
PgDn E0 51 51E0 51E0 76E0 A100 [注释 1][注释 3]
数字键 0 52 5200 5230 9200   [注释 2][注释 7]
Ins E0 52 52E0 52E0 92E0 A200 [注释 1][注释 2][注释 3]
数字键 . 53 5300 532E 9300   [注释 2][注释 7]
Del E0 53 53E0 53E0 93E0 A300 [注释 1][注释 2][注释 3]
F11 57 8500 8700 8900 8B00 [注释 8]
F12 58 8600 8800 8A00 8C00 [注释 8]
左Windows键 E0 5B B6E0 C2E0 CEE0 DAE0 [注释 8]
右Windows键 E0 5C B7E0 C3E0 CFE0 DBE0 [注释 8]
Menu E0 5D B8E0 C4E0 D0E0 DCE0 [注释 8]
注释
  1. ^ 当“功能键”ALT被按下时,INT16\AH=00h 函数不会对该按键的输入做出响应。
  2. ^ 当“功能键”CTRL被按下时,INT16\AH=00h 函数不会对该按键的输入做出响应。
  3. ^ INT16\AH=00h 函数返回 00h 而不是 ASCII 代码 E0h,除了两个例外:在“数字键 /”之后返回 ASCII 代码 35h,在“数字键 Enter”之后返回 ASCII 代码 1Ch。
  4. ^ 该按键的代码不会写入键盘缓冲区,但会影响 INT 09 处理程序对其他按键代码的翻译。
  5. ^ 键盘控制器对 SysRq 按键响应为“E0 2A E0 37”代码序列,对 SysRq 按键释放响应为反向序列“E0 B7 E0 AA”。一些 INT 16 处理程序可能对 CTRL-SysRq 键组合返回其他响应。
  6. ^ a b c d Pause/Break 按键的释放不会单独被注册。每次按下 Pause/Break 按键后,其按下代码紧随释放代码,形成序列“E1 1D 45 E1 9D C5”。INT 09 处理程序在收到这种代码序列后,会重置键盘缓冲区并调用 INT 1B (8.01-95)。
  7. ^ 显示的按键代码对应于 Numlock 开关关闭状态。当 Numlock 开关打开时,表中第三列和第四列显示的代码会交换。
  8. ^ INT 16\AH=00h 函数对这些按键没有响应。
  9. 几种型号的键盘具有三个辅助键用于电源控制: “电源”,“休眠”和“唤醒”。这些按键对应的扫描码分别为 E0 5E,E0 5F,E0 63。

A.02-2 键盘布局和国家代码页

[编辑 | 编辑源代码]

下表包含了 Microsoft Windows 95/98 版本中 MS-DOS 7 国家适配的相关数据。这些数据包括 COUNTRY.SYS 数据文件、三个包含键盘布局的文件(KEYBOARD.SYS,KEYBRD2.SYS 和 KEYBRD3.SYS)以及四个包含不同代码页字体的文件(EGA.CPI,EGA2.CPI,EGA3.CPI 和 ISO.CPI)。

表中的第一列(缩写)包含文字国家代码,第三列(ID)包含键盘布局标识符。这两个项目对于 KEYB.COM 驱动程序(5.02-04)的命令行组成是必要的。布局标识符仅对使用多个键盘布局的国家/地区是必要的,对于其他国家/地区可以省略。

表的第四列(Keyb)指定应加载哪个包含键盘布局的文件:数字 1 对应 KEYBOARD.SYS,数字 2 对应 KEYBRD2.SYS,数字 3 对应 KEYBRD3.SYS,“任何”对应这三个文件中的任何一个。

表的第五列(代码)显示数字国家代码,用于使用 COUNTRY 命令(4.05)加载 COUNTRY.SYS 数据文件(5.02-01)。

表的最后一列(第七列)显示了在不同国家/地区使用的代码页。代码页的编号对于 MORE.COM 工具(6.18)是必要的,它必须从每个 *.CPI 文件中的一组字体中选择一个字体(9.01-02 中的示例)。ISO.CPI 文件提供国际标准化组织推荐的字体。专有的 Microsoft 字体位于 EGA*.CPI 文件中,每个文件中大约有 5 个字体。因此,表的第六列(Ega*)指定应加载哪个 EGA*.CPI 文件:数字 1 对应 EGA.SYS 文件,数字 2 对应 EGA2.CPI,数字 3 对应 EGA3.CPI,“任何”对应这些文件中的任何一个。

缩写 国家/地区 ID Keyb 代码 Ega* 代码页
GR 奥地利 任何 043 任何 CP850
BE 比利时 1,2 032 任何 CP850
BG 保加利亚 442 2 359 3 CP855
BR 巴西 274, 275 1,2 055 任何 CP850
CF 加拿大法语 058 1,2 002 1 CP863
CZ 捷克共和国 243 任何 042 任何 CP852
DK 丹麦 1,3 045 1 CP865
SU 芬兰 任何 358 任何 CP850
FR 法国 120, 189 1,3 033 任何 CP850
GR 德国 任何 049 任何 CP850
GK 希腊 319 2 030 2 CP737, 869
HU 匈牙利 任何 036 任何 CP852
IS 冰岛 161 2 354 2 CP861
IT 意大利 141,142 任何 039 任何 CP850
LA 拉丁美洲 1 003 任何 CP850
NL 荷兰 1,3 031 任何 CP850
NO 挪威 1,2 047 1 CP865
PL 波兰 任何 048 任何 CP852
PO 葡萄牙 1 351 1 CP860
RO 罗马尼亚 333 2 040 任何 CP852
RU 俄罗斯 441 2,3 007 3 CP866
SL 斯洛伐克 245 任何 421 任何 CP852
SP 西班牙 1,3 034 任何 CP850
SV 瑞典 任何 046 任何 CP850
SF 瑞士法语 1,3 041 任何 CP850
TR 土耳其 440, 179 2 090 2 CP857
UK 英国 + 爱尔兰 166, 168 任何 044 任何 CP850
US 美国 + 澳大利亚 任何 001 1,3 CP437
YC 南斯拉夫西里尔文 118 2 038 3 CP855
YU 南斯拉夫拉丁文 234 任何 038 任何 CP852

注释 1:KEYBOARD.SYS 是唯一支持键盘布局打字机模式的文件。

注释 2:Microsoft 的国家适配文件与 KEYRUS.COM 驱动程序(5.02-05)不兼容。后者使用内部代码表和键盘布局。

注释 3:其他国家/地区(中国、以色列、日本等)的字体仅随 Microsoft 操作系统的特定国家/地区版本提供。

A.02-3 BIOS 数据区中的键盘数据字段

[编辑 | 编辑源代码]

下表显示了 BIOS 数据区中键盘数据的分配。所有偏移量相对于 BIOS 数据区开始的段地址 0040h 给出。

偏移量 大小 描述
17h 2 INT 16\AH=12h (8.01-85) 中 AX 返回的标志
19h 1 通过 ALT 加 ASCII 代码的字符输入
1Ah 2 键盘缓冲区中下一个字符的指针
1Ch 2 键盘缓冲区中第一个空单元的指针
1Eh 32 键盘的循环缓冲区
71h 1 标志 如果按下了 Ctrl-Break,则位 7 设置
80h 2 键盘缓冲区的起始偏移量(通常为 1Eh)
82h 2 键盘缓冲区的 END+1 偏移量(通常为 3Eh)
96h 1 标志 位 0 设置:最后读取的代码是 E1h 前缀
      位 1 设置:最后读取的代码是 E0h 前缀
      位 2 设置:已按下右 CTRL 键
      位 3 设置:已按下右 ALT 键
      位 4 设置:已安装“增强型”键盘
      位 6 设置:已收到 2 字节扫描码的第一个字节
97h 1 状态 位 0 设置:Scroll Lock LED 处于打开状态
      位 1 设置:Num Lock LED 处于打开状态
      位 2 设置:Caps Lock LED 处于打开状态
      位 7 设置:键盘已发送错误标志

注释 1:显示的数据分配可能取决于 BIOS 版本(A.01-1)。

A.02-4 国家适配参数块

[编辑 | 编辑源代码]

INT 21\AX=6501h 函数(8.02-74)返回包含当前活动国家适配参数的数据块。INT 21\AX=7002h 函数(8.02-74 中的注释 3)接受相同结构的数据块,定义 MS-DOS 7 的国家适配。

偏移量 大小 描述
00h 1 = 01h on return [注释 1]
01h 2 返回时的表大小 [注释 1]
03h 2 以十六进制形式表示的国家代码 (A.02-2)
05h 2 十六进制代码页编号 (A.02-2)
07h 2 日期格式
= 0000h – 美国 (mm dd yy)
= 0001h – 欧洲 (dd mm yy)
= 0002h – 日本 (yy mm dd)
09h 5 ASCII 货币名称,以 00h 字节结尾
0Eh 2 数字的千位分隔符
10h 2 整数和小数部分的分隔符
12h 2 ASCII 日期分隔符字符
14h 2 ASCII 时间分隔符字符
16h 1 位 0 设置:货币符号位于值之后(否则位于之前)
    位 1 设置:值和货币符号之间有空格
    位 2 设置:货币符号替换小数点
17h 1 货币小数点后的位数
18h 1 位 1 设置:24 小时制时钟,否则为 12 小时制时钟
19h 4 大小写映射例程的入口地址 [注释 2]
2Dh 2 ASCII 数据列表分隔符字符
注释
  1. ^ 当数据块被发送到 INT 21\AX=7002h 函数时,此项将被忽略。
  2. ^ 大小写映射例程将国家字符(ASCII 代码大于 80h 的字符)转换为大写或小写。大小写映射例程应使用 CALL FAR 命令(7.03-08)调用。AL 寄存器用于发送要转换的字符的 ASCII 代码以及返回结果。

A.02-5 国家/地区相关文件名限制

[编辑 | 编辑源代码]

INT 21\AX=6505h 函数(参见 8.02-74 中的注 1)返回指向此表的指针。

偏移量 大小 描述
00h 2 表的尺寸(此词不应计入)
03h 1 文件名允许的最低字符值
04h 1 文件名允许的最高字符值
06h 1 禁止范围内的第一个字符的值
07h 1 禁止范围内的最后一个字符的值
09h 1 文件名终止代码的数量 ("N")
0Ah N 用于终止文件名的 ASCII 代码

A.02-6 可用代码页信息

[编辑 | 编辑源代码]

下表显示了 DISPLAY.SYS (5.02-02) 驱动程序数据块的结构;INT 2F\AX=AD03h 函数(8.03-27)返回指向此块的指针。

偏移量 大小 描述
00h 2 配置指定的代码页数量 M
04h 2 默认加载的代码页数量 N
06h 2N 默认加载的代码页标识符
06h+2N 2M 配置指定的代码页标识符(如果配置尚未准备,则为 = FFFFh)

A.02-7 AMIS 规范中“热键”的定义

[编辑 | 编辑源代码]

TSR 程序的常见做法是将功能分配给预定的“热键”,而不管哪些键已被先前加载的 TSR 程序分配了其他任务。这种做法最无害的结果是失去了调用先前加载的 TSR 程序和驱动程序的功能的机会。AMIS 规范 (A.07-6) 提供了一种防止截取“热键”功能的真正机会。根据 AMIS 规范,驻留模块必须响应对多路复用中断 INT 2D 的调用,操作码为 AL = 05h,并在 DX:BX 寄存器中返回指向其活动“热键”列表的指针。任何打算安排自己“热键”的程序都应该被授予访问先前“热键”分配数据的权限。

从“热键”列表开头偏移 00h 的第一个字节通知“热键”调用拦截方法。[注 1] 偏移 01h 的第二个字节是响应驻留模块保持活动的“热键”数量。这个数字也定义了返回列表的总长度,因为在第二个字节之后,从偏移 02h 开始,是一组“热键”描述符,每个描述符长 6 个字节。这些描述符的结构在下表中显示。表中的偏移是从每个描述符的开头算起的。

偏移量 大小 描述 注释
00h 1 “热键”的扫描码 [注 2]
01h 2 所需的移位状态 [注 3]
03h 2 不允许的移位状态 [注释 4]
05h 1 辅助键的标志 [注释 5]
注释
  1. ^ “热键”列表中偏移 00h 的字节通知“热键”调用拦截方法。此字节中的位 7 必须清除;其他位具有以下含义:
    位 0 设置:在 INT 09 处理程序之前拦截
    位 1 设置:在 INT 09 处理程序之后拦截
    位 2 设置:在 INT 15\AH=4Fh 之前拦截
    位 3 设置:在 INT 15\AH=4Fh 之后拦截
    位 4 设置:拦截 INT 16\AH=00h、01h、02h 调用
    位 5 设置:拦截 INT 16\AH=10h、11h、12h 调用
    位 6 设置:拦截 INT 16\AH=20h、21h、22h 调用。
  2. ^ 如果扫描码的最高位是清除的,则当按下键时会注册操作;如果扫描码的最高位是设置的,则当释放键时会注册操作。如果操作完全是由“功能键”的特定状态组合引起的,则应指定 00h 或 80h 值,而不是扫描码。
  3. ^ 所需移位状态字几乎与 INT 16\AH=12h 函数(8.01-85)返回的键盘标志字相同。唯一的区别是位 7 的含义:在所需移位状态字中,它对应于保持按下(左或右)SHIFT 键。所需移位状态字中任何位的设置状态指定了“热键”操作的必要条件。
  4. ^ 不允许的移位状态字中的位具有与所需移位状态字相同的含义,[注 3] 但它们的设置状态表示相反的条件:阻止“热键”操作。所需条件和不允许条件的组合有助于降低误操作的可能性。
  5. ^ 每个“热键”描述符中的最后一个字节是辅助标志字节。此字节中的位 6 和位 7 必须清除;其他位的状态具有以下含义:
    位 0 设置:在模块执行之前操作
    位 1 设置:在模块执行之后操作
    位 2 设置:允许监控拦截
    位 3 设置:操作被其他键阻塞
    位 4 设置:此“热键”的作用被重新定义
    位 5 设置:操作取决于执行条件。

A.02-8. ASCII 服务标记和命令

[编辑 | 编辑源代码]

美国信息交换标准代码 (ASCII) 中的第 0-31 位专门用于服务标记和命令。所有 DOS 的代码页都继承了这 32 个服务代码。在 MS-DOS 7 下,这些服务代码的大部分被忽略,但有些被执行为命令。

一些服务代码可以通过 1.05 文章中描述的按键组合输入。输入服务代码的另一种方法是使用数字小键盘上的按键输入其十进制 ASCII 编号 (0-31),同时按下 ALT 键。

对输入的服务代码的第一个响应可能来自 CON (控制台) 设备驱动程序的输入模块。进一步的响应可能由命令解释器给出。当一个服务代码被发送到输出时,BIOS 系统能够将其执行为命令 (8.01-21、8.01-33) 或避免其执行 (8.01-17)。默认情况下,CON (控制台) 设备驱动程序的输出模块不会尝试避免执行某些服务代码。可以通过向 CON 设备驱动程序发送参数字符串 (8.02-41) 来更改这种行为,但这样做没有必要,因为 DOS 程序被允许通过所需的 BIOS 函数直接输出数据。

有时 ASCII 服务代码可能有用,但必须事先知道每个特定服务代码将在哪里以及如何解释。因此,下表显示了在 MS-DOS 7 下有效的服务代码列表,以及与这些代码相关的操作描述。

代码 编号 描述
00h 0 解释行的结束标记,包括包含名称和环境变量值的行。
03h 3 “文本结束”标记,终止命令文件的执行(参见 3.21 文章中的示例)。
07h 7 “蜂鸣”代码。发送到输出时,会导致发出短暂的蜂鸣声。
08h 8 将光标向左移动一个字符单元。通过 CON 设备驱动程序发送时,会擦除最后一个字符。
09h 9 水平制表符代码。发送到显示器时,会自动扩展为 8 个空格。
0Ah 10 “换行”代码,会导致转到下一行,而不会将光标返回到行首。[注 1]
0Ch 12 打印机的“弹出纸张”命令。BIOS 和 CON 设备驱动程序都忽略此命令。
0Dh 13 “回车”代码,将光标返回到行首。还在 DTA 区域 (8.02-16) 中标记行尾。
1Ah 26 文本文件的可选结束标记;在该标记处,文件复制可能会中断 (3.06)。
1Bh 27 “转义”代码用作针对 ANSI.SYS 驱动程序(如果已安装)的命令的标记。
注释
  1. ^ 服务代码 0Dh 0Ah 共同用作在 DOS 下键入的所有文本文件的行尾标记。
  2. 有一定几率遇到响应某些服务代码的驻留模块,这些代码未在此处显示,通常在 DOS 下被忽略。

A.03 磁盘访问数据库

[编辑 | 编辑源代码]

A.03-1. 驱动程序参数块 (DPB) 的结构

[编辑 | 编辑源代码]

DOS 将磁盘访问参数存储在 DPB 块中,每个可用的逻辑磁盘都有一个,还有一个用于默认(当前)驱动器的副本。INT 21\AX=7302h 函数(8.02-79)允许将任何 DPB 块复制到准备好的缓冲区中。指向 DPB 块的指针由 INT 21\AH=1Fh 和 INT 21\AH=32h 函数(8.02-24)返回,这些函数在以前版本的 DOS 中有记录。在下面的图 8 中,显示了访问磁盘 C: DPB 块的完整路径,包括调用 INT 21\AH=32h 函数,从 DS:BX 寄存器中读取块地址 00C9:13C0h,以及显示 DPB 块的转储。在偏移 19h 的显示转储中,存在指向与下一个逻辑磁盘 D: 相关的下一个 DPB 块的地址 00C9:13FDh。图 8 中也显示了磁盘 D: 的 DPB 块的转储。

图 8

提到的访问 DPB 块的法律功能会自动尝试读取请求的磁盘,以更新 DPB 块中的数据。这会使程序的执行速度变慢,有时无法应用于可移动介质,因为这些介质可能在此时不存在于驱动器中。另一种方法是从同一磁盘的 CDS 条目 (A.03-3) 中偏移量 45h 处的单元格读取 DPB 块的地址。

所有 DPB 块都具有与下面所示相同的结构。最多偏移量 20h 的字节与以前的 DOS 版本中的字节相同,但超过偏移量 20h 的字节特定于 MS-DOS 7 中的扩展 DPB 块。

偏移量 大小 描述
00h 1 逻辑磁盘号 (00h = A:, 02h = C:,等等)
01h 1 磁盘在驱动器磁盘列表中的编号
02h 2 扇区大小(以字节为单位)
04h 1 簇中的最高扇区号
05h 1 将簇转换为扇区的移位计数
06h 2 保留扇区的数量(在 FAT 之前)
08h 1 FAT 表的数量
09h 2 根目录条目的最大数量
0Bh 2 包含用户数据的第一个扇区的编号
0Dh 2 最高簇号(簇数 + 1)
0Fh 2 每个 FAT 表的扇区数
11h 2 根目录第一个扇区的扇区号
13h 4 指向磁盘驱动程序头的指针 (A.05-1)
17h 1 介质 ID 字节 (INT 21\AH=1Ch, 8.02-17)
18h 1 标志(= 00h 如果磁盘已访问,或 = FFh 如果未访问)
19h 4 指向下一个磁盘的 DPB 块的指针
1Dh 2 开始搜索可用空间的簇
1Fh 2 磁盘上的可用簇数(如果未知,则为 FFFFh)
21h 2 可用簇计数的最高有效字
23h 2 – 位 0–3 : 活动 FAT 的零基 FAT 编号
    – 位 7 : 不要将活动 FAT 复制到非活动 FAT
25h 2 FAT 信息扇区的数量 [备注 2]
27h 2 备份引导扇区的扇区号
29h 4 第一个磁盘的第一个簇的第一个扇区号
2Dh 4 最后一个磁盘的簇号
31h 4 FAT 占用的扇区数
35h 4 根目录开始的簇号
注释
  1. DPB 块中的数据通过 INT 21\AH=53h 函数从同一磁盘的 BPB 块 (A.03-4) 转换而来。
  2. ^ a b 偏移量 25h 处的字 FFFFh 表示请求的磁盘上没有 FAT 信息扇区。如果存在 FAT 信息扇区,则它在偏移量 00h 处包含一个固定的双字签名 61417272h,偏移量 04h 处的第二个双字是可用簇数(如果未知,则为 FFFFFFFFh),偏移量 08h 处的第三个双字是最近分配的簇号。

A.03-2 磁盘数据表 (DDT)

[编辑 | 编辑源代码]

DDT 表代表块设备驱动程序的专用数据库,集成到 DOS 的核心。DDT 表对应于本地磁盘,这些磁盘被 BIOS 正确检测和支持,包括那些由 BIOS 从可启动 CD/DVD-ROM 上的磁盘映像模拟的磁盘。IFS 驱动器、虚拟磁盘、RAM 盘以及所有其他磁盘(由驱动程序打开以访问,在配置文件中指定)没有 DDT 表。

DDT 表被排列成一个链状队列,每个表长 96h 字节。INT 2F\AX=0803h 函数 (8.03-04) 返回指向第一个表的指针。这足以跟踪整个队列,因为每个表中的第一个双字是指向下一个逻辑磁盘的 DDT 表的指针。第一个字为 FFFFh 的表是链中的最后一个表。

图 9

图 9 说明了访问磁盘 A:、B: 和 C: 的 DDT 表,包括调用 INT 2F\AX=0803h 函数,从 DS:DI 寄存器中读取返回的第一个 DDT 表的地址 (0B52:0000h),显示磁盘 A: 的 DDT 表的部分转储,从该转储的前 4 个字节中读取指向下一个磁盘 B: 的 DDT 表的地址 (0B52:0096h),显示磁盘 B: 的 DDT 表的部分转储,以及重复针对磁盘 C: 的 DDT 表的最后两个操作。

下表显示了一个 DDT 表中的数据结构。INT 2F\AX=0801 函数 (8.03-02) 接受相同的数据结构,将一个新的逻辑磁盘的 DDT 表附加到 DDT 表链中。

偏移量 大小 描述
00h 4 指向下一个 DDT 表的指针(如果为最后一个表,则为 FFFFh)
04h 1 相应的物理驱动器号
从 00h 开始,用于软盘驱动器
从 80h 开始,用于硬盘 (固定) 驱动器
05h 1 DOS 核心驱动程序访问的磁盘列表中的逻辑磁盘号。如果磁盘的字母名称未重新分配,则 00h = A:, 02h = C:,等等。
06h 25 当前磁盘的 BPB 块(最多偏移量 19h,A.03-4)
3Bh 1 – 位 6: 文件系统 FAT-16,
    – 位 7: 磁盘必须对所有请求返回“未就绪”
3Ch 2 属于该磁盘的已打开文件的计数器
3Eh 1 设备类型(作为表 A.04-3 中偏移量 01h 处的字节)
3Fh 2 – 位 0: 固定硬盘
    – 位 1: 支持门锁(“变更线”)
    – 位 2: 不允许更改当前 BPB
    – 位 3: 轨道中的所有扇区都具有相同的大小
    – 位 4: 必须指定 LUN 号 [备注 1]
    – 位 5: 该物理驱动器上有多个逻辑磁盘
    – 位 6: 检测到磁盘更改
    – 位 7: 磁盘参数已更改 [备注 2]
    – 位 8: 磁盘重新格式化,介质的 BPB 已更改
    – 位 9: 访问禁止标志 [备注 3]
43h 25 默认磁盘的 BPB (A.03-4) 块 [备注 4]
7Dh 12 长度为 11 个字节的卷标,以 00h 结尾
89h 4 磁盘的序列号
8Dh 9 文件系统类型名称,以 00h 结尾。
注释
  1. ^ a b c d LUN (逻辑单元号) 用于区分共享总线上的相同编号的设备。特别是,对于光学 DVD-RAM 驱动器而言,这一点非常必要,因为它们以不同的 LUN 号呈现自身,要么作为可移动 HDD,要么作为 CD/DVD-ROM 磁盘。闪存卡适配器也将不同插槽中的闪存卡表示为具有不同 LUN 号的磁盘。
  2. ^ 如果磁盘参数已更改,则必须使用 INT 21\AX=440Dh\CX=4840h 函数 (8.02-46) 重置 DDT 表中的数据。
  3. ^ 访问禁止标志会禁用读写操作。它仅适用于 HDD,特别是适用于第一个主分区之外的其他主分区。访问禁止标志的反向状态由 INT 21\AX=440Dh\CX=4867h 函数报告,并且可以使用 INT 21\AX=440Dh\CX=4847h 函数 (8.02-46) 重新设置。
  4. ^ 偏移量 43h 处的 BPB 数据块 (A.03-4) 不对应于当前介质,而是对应于该驱动器的可移动介质的默认类型。通常,默认介质是容量最大的介质。

A.03-3 当前目录结构 (CDS)

[编辑 | 编辑源代码]

CDS 表是一个数据块(条目)数组。每个 CDS 条目对应于一个逻辑磁盘,并指定该磁盘的多个参数,包括指向当前(默认)目录的路径。

指向第一个 CDS 条目的指针存储在 DOS 列表列表 (A.01-2) 中的偏移量 16h 处。在该位置,偏移量 21h 处的字节存储 CDS 表中的条目总数,由 CONFIG.SYS 文件中的 LASTDRIVE 规范 (4.17) 定义。每个 CDS 条目长 58h 字节。

图 10

图 10 说明了访问 CDS 表。第一步是调用 INT 21\AH=52h 函数 (8.02-59),在寄存器 ES:BX 中返回 DOS 列表列表 (00C9:0026h) 的地址。下一步是显示从返回地址开始的内存内容转储。显示转储的长度选择为,使偏移量 16h–19h 处的最后 4 个字节显示 CDS 表的地址 (D203:0000h)。从该地址开始的内存内容转储呈现了磁盘 A: 的 CDS 条目。每个以前的 CDS 条目后面跟着 58h 字节,表示下一个逻辑磁盘的数据。

在 CDS 表条目中,有一些虚拟条目,没有相应的逻辑磁盘。虚拟条目为那些可能在以后创建或变得可访问的逻辑磁盘保留字母名称:RAM 盘、IFS 磁盘、网络磁盘等。CDS 表由 IO.SYS 加载程序在 CONFIG.SYS 文件中解释命令时创建。稍后,不能将新条目附加到 CDS 表。因此,必须使用 LASTDRIVE 命令 (4.17) 预先订购足够数量的虚拟条目。

下表显示了单个 CDS 条目的数据结构。

偏移量 大小 描述
00h 67 指向当前目录的路径。 [备注 1] [备注 2]
43h 2 该逻辑磁盘的属性字
      位 7 : 从分配列表中隐藏磁盘的字母名称
      位 12 : 由 SUBST.EXE 创建的虚拟磁盘 [备注 2]
      位 13 : 由 JOIN.EXE 创建的虚拟磁盘 [备注 2]
      位 14 : 磁盘位于物理驱动器上 [备注 3] [备注 4]
      位 15 : 通过网络重定向器访问磁盘 [备注 4]
45h 4 指向该磁盘的 DPB 块的指针 (A.03-1)
49h 2 当前目录的起始簇 [备注 5]
4Fh 2 要隐藏的字符数 [备注 6]
52h 4 指向重定向器或 IFS 驱动程序的指针(如果不存在,则为零)
注释
  1. ^ 对于本地磁盘,指向当前目录的路径包括磁盘的字母名称、冒号、反斜杠以及路径的其余部分。路径的结尾必须用字节 00h 标记。
  2. ^ 如果属性字中的位 12 或位 13 被设置,则偏移量 00h 处的路径不是真正的路径。
  3. ^ 当属性位 14 和 15 都为 0 时,表示该条目为虚拟条目或已禁用。这类磁盘会被隐藏。
  4. ^ 如果属性字中的位 14 和 15 都被设置,则该磁盘表示一个 IFS 文件系统。
  5. ^ 该簇号是从逻辑磁盘的开头开始计算的。因此,根目录的簇号为 0000h。如果磁盘尚未访问,则簇字段将填充为 FFFFh。
  6. ^ 如果偏移量 4Fh 处的字定义了非零个字符,则 DOS 可能只报告当前目录路径的最后一部分,这些字符将被隐藏。
  7. 在早期的 DOS 版本中,CDS 条目长 51h 字节;从 MS-DOS 4 开始,添加了字节 51h–57h 以供 IFS 和网络驱动程序使用。

A.03-4 磁盘的 BIOS 参数块 (BPB)

[编辑 | 编辑源代码]

BPB 是磁盘介质引导扇区的一部分。当 DOS 启动时,BPB 数据被用于填充内部 DOS 的表格:DPB (A.03-1) 和 DDT (A.03-2)。此过程在每次检测到介质更改时都会重复,以确保数据始终保持最新。

在具有 FAT-16 文件系统的磁盘分区中,BPB 长 39h 字节;其结构显示在下表的第一列 (“F16”) 中。DDT 表格中的 BPB 数据具有略微不同的“标准”结构,显示在第三列 (“STD”) 中。标准 BPB 块被 INT 21\AX=440Dh\CX=0840h 函数接受,并被 INT 21\AX=440Dh\CX=0060h 函数返回 (8.02-46)。这两个函数只能应用于具有 FAT-12 或 FAT-16 文件系统的磁盘。

在具有 FAT-32 文件系统的磁盘分区中,BPB 长 5Ah 字节;其结构显示在下表的第二列 (“F32”) 中。DDT 表格中的相同数据按照新的“扩展”结构排列,显示在下表的第四列 (“EXT”) 中。对于这些数据结构,MS-DOS 7 提供了其他功能 (8.02-46),这些功能在以前的 DOS 版本中不可用:INT 21\AX=440Dh\CX=4840h 用于刷新 DDT 中的 BPB 数据,INT 21\AX=440Dh\CX=4860h 用于读取 DDT 中的 BPB 数据。这两个新功能都应该应用于使用 FAT-32 文件系统格式化的磁盘。

F16 F32 Std Ext 大小 描述
00h 00h     3 跳转指令 EBh 3Ch 90h 用于 FAT-16
          EBh 5Ah 90h 用于 FAT-32
03h 03h     8 形成 BPB 块的程序的 ID
0Bh 0Bh 00h 00h 2 扇区大小(以字节为单位)
0Dh 0Dh 02h 02h 1 每个簇的扇区数(如果未知,则为 FFh)
0Eh 0Eh 03h 03h 2 第一个 FAT 之前的保留扇区数
10h 10h 05h 05h 1 FAT 的数量(通常为 2)
11h 11h 06h 06h 2 根目录中的条目数
13h   08h 08h 2 = 0000h [注释 1]
15h 15h 0Ah 0Ah 1 介质 ID 字节 [注释 2]
16h 16h 0Bh 0Bh 2 每个 FAT 的扇区数 [注释 3]
18h 18h 0Dh 0Dh 2 每个磁道的扇区数
1Ah 1Ah 0Fh 0Fh 2 磁头数
1Ch 1Ch 11h 11h 4 起始扇区号 [注释 4]
20h 20h 15h 15h 4 扇区总数 [注释 1]
  24h   19h 4 每个 FAT 的扇区数 [注释 3]
  28h   1Dh 2 与 DPB 中的字 23h 相同 (A.03-1)
    1Fh   2 柱面数 [注释 5]
  2Ah   1Fh 2 文件系统版本
    21h   1 设备类型(如 A.04-3 中的字节 01h)
  2Ch   21h 4 根目录的第一个簇号
    22h   2 属性(如 A.04-3 中的字 02h)
24h 40h     1 物理驱动器号
      25h 2 信息扇区 [注释 2 至 A.03-1]
26h 42h     1 扩展引导扇区签名(= 29h)
27h 43h   27h 4 磁盘序列号(以二进制形式)
2Bh 47h   2Bh 11 卷标(或“NO NAME ”)
36h 52h   36h 8 文件系统类型名称
注释
  1. ^ 对于小于 32 Mb 的分区,偏移量 15h 处的双字必须为零,此类分区中的扇区数必须在偏移量 08h 处的字中指定。
  2. ^ 介质 ID 字节对应于 INT 21\AH=1Ch 函数 (8.02-17) 的规范。如果无法识别可移动介质的类型,则将 00h 值分配给介质 ID 字节。
  3. ^ 在“扩展”BPB 块中,偏移量 0Bh 处的单元格值为 0000h,FAT 表所占的扇区数用偏移量 19h 处的单元格中的双字值表示。
  4. ^ 在 HDD 分区的 BPB 中,起始扇区号与相应分区描述符 (A.13-5) 中偏移量 08h 处指定的起始扇区号相同。
  5. ^ 标准 BPB 块中的字 1Fh 和后面的字节 21h、22h 不包含在扩展 BPB 块和 DDT 表格 (A.03-2) 中的 BPB 块中。

A.04 I/O 控制数据表

[编辑 | 编辑源代码]

A.04-1 用于 IOCTL 序列号功能的数据块

[编辑 | 编辑源代码]

该数据块由函数 INT 21\AX=440Dh\CX=4866h (8.02-46) 和 INT 21\AX=6900h (8.02-77) 返回,用于从存储介质读取序列号。相同结构的数据块被函数 INT 21\AX=440Dh\CX=4846h (8.02-46) 和 INT 21\AX=6901h (8.02-77) 接受,用于将新的序列号分配给磁盘。

偏移量 大小 描述
00h 2 = 0000h
02h 4 磁盘序列号(以二进制形式)
06h 11 磁盘卷标(或“NO NAME    ”,如果不存在)
11h 8 仅在返回时 : 文件系统类型名称 [注释 1]
注释
  1. ^ 名称“CDROM   ”对应于 High-Sierra CD-ROM 文件系统,名称“CD001   ”对应于 ISO 9660 CD-ROM 文件系统。

A.04-2 文件句柄的信息字

[编辑 | 编辑源代码]

在 SFT 条目 (A.01-4) 中偏移量 05h 处读取的句柄信息字由 INT 21\AX=4400h 函数 (8.02-40) 返回。如果指定的句柄引用与非文件对象相关的 SFT 条目,则返回的信息字应根据表 A.05-2 进行解释。如果指定的句柄引用与已打开文件相关的 SFT 条目,则返回的信息字应根据下表进行解释。文件句柄信息字的显著特征是其第 7 位的清晰状态。

描述
15 文件不是本地的,它是通过重定向器(网络)访问的
14 在关闭文件时不要设置文件日期/时间
11 文件存储在固定(不可移动)介质上
7 位 7 的清除状态是文件句柄的显著特征
6 写入操作尚未执行
5-0 磁盘号(000000b = A:,000001b = B:,000010b = C:,依此类推)

A.04-3 用于磁盘参数规范的数据块

[编辑 | 编辑源代码]

在调用子函数 INT 21\AX=440Dh\CX=4840h (8.02-46) 以更新表格 DPB (A.03-1) 和 DDT (A.03-2) 中的 BPB 数据之前,应在 DS:DX 寄存器中准备指向此数据块的指针。相同结构的数据块由 INT 21\AX=440Dh\CX=4860h 子函数 (8.02-46) 返回。应提前在 DS:DX 寄存器中准备返回的数据块的缓冲区地址。偏移量 00h 处的标志字节不会被返回,它定义了请求条件,应该在调用之前指定。

偏移量 大小 描述
00h 1 标志(位 3-7 必须为零) 
位 0 : 对当前 BPB 应用操作 [注释 1]
位 1 : 只使用磁道布局字段 [注释 2]
位 2 : 扇区大小相同 [注释 2]
01h 1 设备类型 
= 00h – 320 kb 或 360 kb 软盘驱动器
= 01h – 1.2 Mb 软盘驱动器
= 02h – 720 kb 软盘驱动器
= 05h – 固定(硬盘)磁盘驱动器
= 06h – 磁带驱动器存储设备
= 07h – 其他设备(包括 1.44 Mb 软盘)
= 08h – 光盘驱动器
= 09h – 2.88 Mb 软盘驱动器
02h 2 存储设备属性(位 2-15 必须为零) 
位 0 : 具有不可移动介质的设备
位 1 : 支持介质更改注册
04h 2 柱面数(或磁道数)
06h 1 介质标志 
= 01h – 320kb/360kb 磁盘
= F8h – 压缩逻辑磁盘
= 00h – 所有其他类型的介质
07h 31 BPB 数据块 [注释 3]
注释
  1. ^ 如果标志字节中的位 0 被设置,则更新或复制 BPB 块 (A.03-4) 会导致尝试访问物理存储介质。但是,当标志字节中的位 0 为清除时,不会尝试访问物理存储介质:操作对象将是 DDT 表格 (A.03-2) 中偏移量 43h 处的 BPB 块的副本,它指定了该特定设备的默认存储介质类型。
  2. ^ 标志字节中的位 1 和 2 指定了定义磁道中扇区分配的可选子表的解释。该子表最多可以长 256 字节,对于子函数 CX=0840h,它可以从偏移量 26h 开始,对于子函数 CX=4840h,它可以从偏移量 5Ch 开始。不过,本书中没有考虑扇区大小不一致的介质。对于子函数 CX=4860h,标志字节中的位 1 必须为清除。
  3. ^ 对于子函数 CX=0840h,偏移量 07h 处的 BPB 表格必须具有标准 BPB 结构 (A.03-4)。如果偏移量 00h 处的标志字节的位 0 被设置,则 BPB 块的最后 6 个字节被子函数 CX=0840h 接受,否则偏移量 1Eh 之后的字节将被忽略。对于子函数 CX=4840h,偏移量 07h 处的 BPB 表格必须根据扩展 BPB 结构 (A.03-4) 长度为 53 字节。

A.04-4 读写函数的数据块结构

[edit | edit source]

INT 21\AX=440Dh\CX=4861h 读取函数和 INT 21\AX=440Dh\CX=4841h 写入函数 (8.02-46) 接收指向此数据块的指针。在 Windows 操作系统下,除非事先锁定所指向的逻辑磁盘 (8.01-58),否则这些函数无法在“DOS 框”中执行。

偏移量 大小 描述
00h 1 = 00h
01h 2 请求的驱动器磁头号
03h 2 请求的驱动器柱面号
05h 2 要开始读或写的扇区号
07h 2 要读或写的扇区数量
09h 4 指向带有数据或用于数据的缓冲区的指针

A.04-5 格式化/校验函数的数据块结构

[edit | edit source]

INT 21\AX=440Dh\CX=4842h 格式化函数和 INT 21\AX=440Dh\CX=4862h 校验函数 (8.02-46) 接收指向此数据块的指针。在 Windows 操作系统下,除非事先锁定所指向的逻辑磁盘 (8.01-58),否则这些函数无法在“DOS 框”中执行。

偏移量 大小 描述
00h 1 位 0 : 查询状态码,不要实际格式化
    位 1 : 格式化多个磁道 (仅适用于硬盘)
01h 2 要激活的驱动器磁头
03h 2 磁头应驱动到的柱面
05h 2 要格式化或校验的磁道数量

注意 1: 对于格式化函数,如果偏移量为 00h 的字节的位 1 为清除状态,则忽略 05h 处的字:在这种情况下,将只格式化一个磁道。

注意 2: 对于校验函数,05h 处的字中的磁道数量应不超过 255 个扇区,偏移量为 00h 的字节中设置的位 0 指定多个磁道的校验,位 1 必须为零。

注意 3: 返回时,偏移量为 00h 的字节将被替换为状态码 

00h – BIOS 支持此功能,
01h – BIOS 不支持此功能,
02h – 给定的规格不适合此逻辑磁盘,
03h – 驱动器中没有介质。

返回的状态码 00h 并不确认操作成功 : 成功的操作应由返回的 CF 标志清除状态确认。

A.05 驱动程序的数据结构

[edit | edit source]

A.05-1 驱动程序的头结构

[edit | edit source]

下表显示了三种类型 DOS 驱动程序头的偏移数据 

“B”列 – 用于“块”设备,即磁盘和磁带存储驱动器 ;
“C”列 – 用于“字符”设备,即通信通道 ;
“D”列 – 用于与 MSCDEX.EXE 协同工作的 CD-ROM 驱动程序。

指向磁盘驱动程序头的指针位于对应磁盘的驱动程序参数块 (A.03-1) 中的偏移量为 13h 的双字中。“字符”设备驱动程序可以通过跟踪头地址链,在它们的头的偏移量为 0Ah 处找到签名。跟踪起始地址可以在 DOS 的列表列表 (A.01-2) 中的偏移量为 22h 处获得,也可以通过 INT 2F\AX=122Ch 函数 (8.03-12) 获得。

B C D 大小 描述
00h 00h 00h 4 下一个驱动程序的地址字段 [注意 1]
04h 04h 04h 2 驱动程序的属性 (A.05-2)
06h 06h 06h 2 策略例程入口点的偏移量
08h 08h 08h 2 中断例程入口点的偏移量
  0Ah 0Ah 8 驱动程序的签名字段
    14h 1 由驱动程序控制的第一个磁盘 [注意 2]
0Ah   15h 1 由驱动程序控制的磁盘数量
注释
  1. ^ 下一个驱动程序的地址字段必须初始化为 FFFF:FFFFh; 以后 DOS 将用下一个驱动程序的地址填充此字段。如果没有加载下一个驱动程序,则当前驱动程序头开始处的剩余 FFFFh 值将表示驱动程序地址引用链的结束。
  2. ^ 偏移量为 14h 的字节必须初始化为 00h 值。以后 MSCDEX.EXE 程序 (5.08-03) 或 SHSUCDX.EXE 程序 (5.08-04) 将用由该驱动程序控制的第一个磁盘的数字 (8.02-17 的注释 1) 替换初始的零值。

A.05-2 驱动程序的属性

[edit | edit source]

驱动程序的属性字位于驱动程序头的偏移量为 04h 处 (A.05-1)。但属性字中大多数位的含义对于“字符”设备驱动程序 (下表第二列) 和“块”设备驱动程序 (第三列) 不同。与 MSCDEX.EXE (5.08-03) 或 SHSUCDX.EXE (5.08-04) 程序协同工作的 CD/DVD-ROM 设备驱动程序,以及由 SUBST.EXE 程序 (6.23) 创建的虚拟磁盘驱动程序,在形式上属于“字符”设备驱动程序,因为它们的属性字中的位 15 被设置。

字符设备驱动程序的属性字用作通道句柄信息字的基础,该字存储在相应 SFT 条目 (A.01-4) 中的偏移量为 05h 处,并由 INT 21\AX=4400h 函数 (8.02-40) 在响应通道句柄请求时返回 (有关文件句柄请求的信息,请参阅 A.04-2)。“字符”设备驱动程序的属性字与通道句柄信息字之间的差异表现在下表第二列中位 4-7 中:这些位在“字符”设备驱动程序的属性字中通常为清除状态。在通道句柄信息字中,位 7 被设置:这是它们与文件句柄信息字的主要区别特征。

“字符”设备 (通道) “块”设备 (磁盘、磁带)
0 STDIN 通道 [注意 1] = 0 (保留)
1 STDOUT 通道 [注意 1] 32 位地址支持
2 NUL 通道 [注意 1] = 0 (保留)
3 CLOCK 通道 [注意 1] = 0 (保留)
4 通过 INT 29 支持输出 = 0 (保留)
5 原始输出 [注意 2] = 0 (保留)
6 通道在输入时添加 EOF IOCTL 支持 [注意 3]
7 = 1 (作为非文件句柄) IOCTL 支持 [注意 4]
9 = 0 (保留) 无直接 I/O [注意 5]
11 锁定支持 [注意 6] 锁定支持 [注意 6]
12 = 0 (保留) CD-ROM 或远程设备
13 支持直到忙状态的输出 非 IBM 格式
14 IOCTL 支持 [注意 7] IOCTL 支持 [注意 7]
15 = 1 – “字符”设备症状 = 0 – “块”设备症状
注释
  1. ^ 在字符设备驱动程序的属性位 0-3 中,只能设置一位 (或不设置)。
  2. ^ 原始 (二进制) 输出表示驱动程序不将任何输出字符解释为命令 (如 A.02-8 中所示)。
  3. ^ 设置位 6 的状态表示支持 INT 21\AX=440Ch、440Dh、440Eh、440Fh 函数。
  4. ^ 设置位 7 的状态表示支持 INT 21\AX=4410h、4411h 函数。
  5. ^ 设置位 9 的状态表示由该驱动程序控制的磁盘无法被 BIOS INT 13 处理程序的函数访问。设置位 9 的状态对于提供对远程磁盘、IFS 磁盘和参数磁盘 (由 DRIVPARM 命令 (4.09) 替换) 的访问的驱动程序来说很常见。
  6. ^ 设置位 11 的状态表示驱动程序能够为可移动磁盘驱动器传输插槽盖锁定信号。
  7. ^ a b设置位 14 的状态表示驱动程序能够处理通过 INT 21\AX=4403h 和 INT 21\AX=4405h 函数 (8.02-41) 发送的控制参数。
  8. 在本表中未提及的驱动程序属性位被认为是保留的,并且通常必须为清除状态。

A.05-3 对设备驱动程序的选定请求

[edit | edit source]

DOS 与任何设备驱动程序之间的交互是通过向驱动程序的策略例程发送带有 CALL FAR 命令的 ES:BX 寄存器中的请求数据块地址来执行的。驱动程序接收操作代码并启动其执行。一段时间后,DOS 会发送另一个对驱动程序的中断例程的调用,该例程会用已执行操作的请求结果填充相同的数据块。如果返回的数据块 (A.05-4) 中的状态字节确认操作成功终止,则 DOS 将接受结果。

INT 2F\AX=0802h 函数 (8.03-03) 接受相同形式的请求数据块,该函数隐式地将请求发送到集成到 DOS 内核中的块设备驱动程序。这些驱动程序控制逻辑磁盘,其参数在相应的 DDT 表 (A.03-2) 中注册。只有这些逻辑磁盘才能被 INT 2F\AX=0802h 函数访问。

下表的第一列指定请求数据块的大小,第二列指定请求的操作代码,第四列显示该操作可以应用于哪种驱动程序类型。第五列显示该操作是否可以通过 INT 2F\AX=0802h 函数请求。

大小 代码 操作 设备类型 802 注释
19h 00h 初始化 两种类型 N A.05-5
0Fh 01h 介质更改检查 "块" 类型 Y [注 2]
14h 03h 存储 IOCTL 字符串 [注释 1] N A.05-7
1Eh 04h 读取数据 两种类型 Y A.05-6
0Eh 05h 非破坏性读取 字符类型 N [注 3]
0Dh 06h 输入状态请求 字符类型 N A.05-4
0Dh 07h 刷新输入缓冲区 字符类型 N A.05-4
1Eh 08h 写入(发送)数据 两种类型 Y A.05-6
1Eh 09h 写入磁盘并验证 "块" 类型 Y A.05-6
0Dh 0Ah 输出状态请求 字符类型 N A.05-4
0Dh 0Bh 刷新输出缓冲区 字符类型 N A.05-4
14h 0Ch 接收 IOCTL 字符串 [注释 1] N A.05-7
0Dh 0Dh 设备打开 两种类型 N A.05-4
0Dh 0Eh 设备关闭 两种类型 N A.05-4
0Dh 0Fh 检测可移动磁盘 "块" 类型 Y A.05-4
14h 10h 发送数据直到繁忙 字符类型 N A.05-7
0Dh 17h 获取磁盘编号 "块" 类型 Y A.05-4
注释
  1. ^ 仅针对那些在其属性字 (A.05-2) 中设置了第 14 位的驱动程序(无论哪种类型)可以处理发送或接收 IOCTL 字符串的请求。
  2. ^ 命令 01h(介质检查)在请求数据块的偏移量 0Dh 处接受介质标识符,并在同一个数据块的偏移量 0Eh 处返回状态字节。状态字节的值应解释如下:
    FFh – 介质未改变;
    01h – 介质已改变;
    00h – 无法确定介质更改状态。
  3. ^ 命令 05h(非破坏性读取)在请求数据块的偏移量 0Dh 处返回一个数据字节,如果偏移量 04h(A.05-4)处的状态字节中的 BUSY 位在返回时未设置。

A.05-4 请求头格式

[edit | edit source]

所呈现的头格式用于请求数据块,这些数据块通过 CALL FAR 命令(A.05-3)或通过调用 INT 2F\AX=0802h 函数 (8.03-03) 发送到驱动程序。在这两种情况下,指向请求数据块的指针必须位于 ES:BX 寄存器中。头占用请求数据块中偏移量 00h–0Ch 的字节。对于许多操作(06h、07h、0Ah、0Bh、0Dh、0Eh、0Fh、17h),请求数据块只是头。下表显示了对所有驱动程序请求通用的头的结构。

偏移量 大小 描述
00h 1 请求块的长度(表 A.05-3,第 1 列)
01h 1 被访问的逻辑磁盘编号 [Note 2]
02h 1 操作代码(表 A.05-3,第 2 列)
03h 1 错误代码 [Note 3][Note 4]
04h 1 返回的状态字节
01h – 操作成功完成
02h – 被访问的设备繁忙
80h – 错误,操作失败
注释
  1. 如果操作 0Fh(检测可移动驱动器)返回状态 02h(繁忙),则表示被访问的驱动器是固定驱动器。
  2. ^ 这里,逻辑磁盘由其在被访问的驱动程序控制的磁盘列表中的编号定义。当通过 INT 2F\AX=0802h 函数 (8.03-03) 发送请求时,这些逻辑磁盘编号与绝对逻辑磁盘编号相同:00h = A:,02h = C:,依此类推,但仅限于那些在 DDT 表 (A.03-2) 中指定其参数的逻辑磁盘。
  3. ^ 仅当偏移量 04h 处的状态字节具有 80h 值,即确认错误结果时,才会返回错误代码。然后,应根据表 A.06-1 中 INT 2F 的记录来解释错误代码。
  4. ^ 成功的情况下,操作 17h(获取磁盘编号)在偏移量 03h 处返回请求的逻辑磁盘的绝对编号。如果请求的编号超出了被访问的驱动程序控制的逻辑磁盘列表,则返回 00h 值。无论如何,不会检查磁盘类型和介质存在。

A.05-5 初始化请求数据块

[edit | edit source]

仅在驱动程序由 IO.SYS 加载程序安装时,DOS 才会向该驱动程序发送一次初始化过程请求。请求通过 CALL FAR 命令发送,该命令在寄存器 ES:BX 中包含指向请求数据块的指针。初始化过程的代码 00h 在请求数据块 (A.05-03) 的头中指定。接受初始化请求后,驱动程序会探索其负责的可用硬件。一些初始数据以及驱动程序返回的数据将在请求数据块的其余部分中传输,超出其头。下表显示了请求数据块 (偏移量 0Dh–18h) 这部分中的数据布置。

偏移量 大小 描述
0Dh 1 返回时 此驱动程序控制的逻辑磁盘数量。
0Eh 4 调用时 指向该驱动程序可能占用的内存空间末尾的下一个字节的指针。
    返回时 指向该驱动程序的 TSR 部分实际占用的内存空间后的第一个空闲字节的指针。
12h 4 调用时 指向命令行参数的指针。
    仅针对 "块" 设备驱动程序返回时:指向 BPB 数据数组 (A.03-4) 的指针。
16h 1 调用时 此驱动程序控制的第一个逻辑磁盘的基于零的编号(即 A: = 00h,C: = 02h,依此类推)。
17h 2 返回时 错误消息标志 [Note 2]
注释
  1. "字符" 设备驱动程序必须在偏移量 12h 处返回零。
  2. ^ 偏移量 17h 处的错误消息标志值为 0000h 不会导致显示错误消息。但是,如果驱动程序返回错误消息标志值为 0001h,则 DOS 将显示消息:"您的 CONFIG.SYS 文件中的第 ... 行存在错误..."

A.05-6 I/O 请求数据块的结构

[edit | edit source]

I/O 请求数据块用于驱动程序的数据传输操作,这些操作通过 CALL FAR 命令(A.05-3)或通过 INT 2F\AX=0802h 函数 (8.03-03) 直接调用。请求数据块的地址在 ES:BX 寄存器中给出,此请求数据块的头指定请求的操作代码:04h、08h 或 09h。数据读取操作(代码 04h)将数据从介质传输到内存中准备好的缓冲区。数据写入操作(代码 08h 和 09h)将数据从缓冲区发送到磁盘或输出通道。所有提到的数据传输操作都使用具有相同结构的请求数据块,包括头 (A.05-4) 和包含访问参数的其余部分。下表显示了这些参数在头之外的布置。

偏移量 大小 描述
0Dh 1 介质标识符(仅适用于块设备)
0Eh 4 包含数据或用于数据的缓冲区的地址
12h 2 数据包的长度 [Note 1]
14h 2 起始扇区号 [Note 2]
16h 4 指向卷标识符的指针 [Note 3]
1Ah 4 32 位起始扇区号 [Note 2]
注释
  1. ^ 通道驱动程序的数据包长度以字节为单位计算。磁盘 ("块" 设备) 驱动程序的数据包长度以扇区数量表示。
  2. ^ 一些其他 DOS 版本使用另一种数据格式,在偏移量 14h 处包含 4 字节起始扇区号;此数据格式的一个区别特征是在头 (A.05-4) 的第一个字节中指定的请求数据块长度为 18h。MS-DOS 7 仅向那些通过在其驱动程序的属性字 (A.05-2) 中设置第 1 位来声明其支持 32 位寻址的驱动程序发送 4 字节起始扇区号。这些驱动程序的起始扇区号在偏移量 1Ah 处指定,然后偏移量 14h 处的单元格将填充为 FFFFh。
  3. ^ 指向卷标识符的指针由驱动程序在发生错误 0Fh(介质更改不当)时返回。

A.05-7 字符串操作的请求数据块

[edit | edit source]

此数据块用于驱动程序的字节字符串传输操作,这些操作通过 CALL FAR 命令(A.05-3)调用。数据块的地址在 ES:BX 寄存器中指定,该数据块的头 (A.05-4) 指定请求的操作代码:03h、0Ch 或 10h。代码为 10h 的操作将数据字符串发送到通道。操作代码为 03h、0Ch 的请求仅可针对那些通过在其属性字中设置第 14 位来声明 IOCTL 支持的驱动程序[Note 7 to A.05-2]。操作代码为 03h 的请求建议考虑通过 INT 21\AX=4403h 或 INT 21\AX=4405h 函数 (8.02-41) 发送的控制参数的新值。操作 0Ch 是向驱动程序发出请求,要求其报告通过 INT 21\AX=4402h 或 INT 21\AX=4404h 函数 (8.02-41) 请求的其实际控制参数。

上述操作的请求数据块必须具有相同的结构,包括头 (A.05-4) 和其余部分;下表显示了请求数据块其余部分中的数据布置。

偏移量 大小 描述
0Dh 1 介质标识符(仅适用于 "块" 设备驱动程序)
0Eh 4 缓冲区区域的地址(包含数据或用于数据)
12h 2 调用时 要读取或写入的字节数
    返回时 实际读取或写入的字节数

A.06 错误代码

[edit | edit source]

A.06-1 错误代码汇总表

[edit | edit source]

发生任何错误后,BIOS 和 DOS 函数都会返回错误代码。MS-DOS 7 的函数通常将错误代码留在 AL 中。BIOS 操作后,错误代码可能会在 AH 中返回。许多错误代码的解释取决于哪个处理程序留下了该错误代码。为方便起见,提供的摘要表包含了几乎所有可能在 MS-DOS 7 下遇到的错误代码解释。在给出各种选择的情况下,您可以根据返回错误代码的处理程序轻松选择合适的解释。

代码 处理程序 描述
00h INT 24-2F 尝试写入保护违规
  其他 无错误,操作成功完成
01h INT 13 无效参数或请求的磁盘不存在
  INT 15 奇偶校验错误
  INT 16 键盘缓冲区已满
  INT 24-2F 驱动程序未知的磁盘编号
  其他 无效的函数编号或操作编号
02h INT 13 未找到地址标记
  INT 15 中断错误
  INT 24-2F 驱动器未就绪
  其他 找不到文件
03h INT 13 磁盘为写保护
  INT 15 地址线 A20 门控失败
  INT 24-2F 驱动程序未知的命令
  其他 路径错误或路径未找到
04h INT 13 扇区未找到或读取错误
  INT 24-2F 数据错误(CRC 错误)
  其他 打开的文件过多(没有更多句柄的空间)
05h INT 13 复位失败
  INT 24-2F 请求数据块的长度错误
  其他 拒绝访问
06h INT 13 驱动器中没有介质或介质已更改
  INT 24-2F 寻道错误
  其他 无效句柄
07h INT 13 驱动器参数活动失败
  INT 24-2F 未知介质类型
  其他 内存控制块 (MCB) 被破坏
08h INT 13 DMA 溢出
  INT 24-2F 扇区未找到
  其他 内存不足
09h INT 13 DMA 尝试跨越 64K 或超过 80h 扇区
  INT 15 无效的 APM 设备标识符
  INT 24, 2F 打印机缺纸
  其他 无效的内存块地址
0Ah INT 13 检测到坏扇区标志
  INT 24-2F 写入尝试失败
  其他 无效的环境
0Bh INT 13 检测到坏磁道
  INT 15 指定的设备不在 APM 控制之下
  INT 24-2F 读取故障
  其他 格式无效
0Ch INT 13 不支持的磁道格式或无效的介质
  INT 24-2F 一般性故障
  其他 无效的访问模式
0Dh INT 13 格式中扇区数无效
  INT 24-26 共享冲突
  其他 无效数据
0Eh INT 13 检测到控制数据地址标记
  INT 24-2F 锁定冲突或介质不可用
0Fh INT 13 DMA 仲裁级别超出范围
  INT 24-2F 无效的磁盘更改
  其他 无效的驱动器
10h INT 13 读取时出现不可纠正的 CRC 或 ECC 错误
  INT 24 FCB 不可使用
  其他 尝试删除当前目录
11h INT 13 数据已通过 ECC 纠正
  INT 24-26 共享缓冲区溢出
  其他 这不是同一个设备
12h INT 24 代码页不匹配
  其他 没有更多文件,文件索引超出范围
13h INT 24-26 输入不足
  其他 磁盘为写保护
14h INT 24, 26 磁盘空间不足
  其他 未知单元
15h   驱动器未就绪
16h   未知命令
17h   数据 CRC 错误
18h   请求数据块的长度错误
19h   寻道错误
1Ah   未知介质类型(非 DOS 磁盘)
1Bh   扇区未找到
1Ch   打印机缺纸
1Dh   写入故障
1Eh   读取故障
1Fh   一般性故障
20h INT 13 控制器故障
  其他 共享冲突
21h   锁定冲突
22h   磁盘更改无效 [注 2]
23h   FCB(文件控制块)不可用
24h   共享缓冲区溢出
25h   代码页不匹配
26h   无法完成文件操作(输入不足)
27h   磁盘空间不足
30h INT 13 驱动器没有介质传感器
31h INT 13 驱动器中没有介质
32h INT 13 非默认介质
  其他 不支持网络请求
33h   远程计算机未监听
34h   网络上存在重复名称
35h   找不到网络名称
36h   网络繁忙
37h   网络设备不再存在
38h   网络 BIOS 命令限制已超过
39h   网络适配器硬件错误
3Ah   网络响应不正确
3Bh   意外的网络错误
3Ch   远程适配器不兼容
3Dh   打印队列已满
3Eh   队列未满
3Fh   没有足够的空间打印文件
40h INT 13 寻道失败
  其他 网络名称已被删除
41h   拒绝访问网络
42h   网络设备类型不正确
43h   找不到网络名称
44h   网络名称限制已超过
45h   网络 BIOS 会话限制已超过
46h   暂时暂停
47h   网络请求未被接受
48h   网络打印/磁盘重定向已暂停
50h   文件已存在
52h   无法创建目录
53h   INT 24h 失败
54h   重定向过多
55h   重复重定向
56h   密码无效
57h   参数无效
58h   网络写入故障
59h   此功能不支持网络
5Ah   缺少必要的系统组件
60h INT 15 请求的 APM 模式不可用(被阻止)
64h Mscdex.exe 未知错误
65h Mscdex.exe 未就绪
66h Mscdex.exe EMS 内存不再有效
67h Mscdex.exe 不是 High Sierra 或 ISO-9660 格式
68h Mscdex.exe 插槽门已打开
80h INT 13 超时,无响应(驱动器可能不存在)
  INT 67 内部错误
  其他 无效的命令或功能未实现
81h INT 67 硬件故障
  Himem.sys 检测到 VDISK 驱动程序
82h Himem.sys 发生了 A20 线错误
83h INT 67 无效句柄
84h INT 67 应用程序请求的未定义功能
85h INT 67 没有更多可用句柄
86h INT 67 映射上下文保存或恢复错误
  其他 请求的功能不受支持
87h INT 67 内存页数不足
88h INT 67 可用的内存页数不足
89h INT 67 请求的页数为零
8Ah INT 67 遇到无效的逻辑页号
8Bh INT 67 遇到无效的物理页号
8Ch INT 67 页映射硬件状态保存区已满
8Dh INT 67 映射上下文保存失败
8Eh INT 67 映射上下文恢复失败
  Himem.sys 一般 XMS 驱动程序错误
8Fh INT 67 未定义的子功能
  Himem.sys 不可恢复的 XMS 驱动程序错误
90h INT 67 未定义的属性类型
  Himem.sys HMA 不存在或不受 XMS 提供程序管理
91h INT 67 此功能不受支持
  Himem.sys HMA 正在使用中
92h INT 67 成功,但源区域的一部分被覆盖
  Himem.sys DX 小于 /HMAMIN 参数 (5.04-01)
93h INT 67 数据长度超过分配给句柄的空间
  Himem.sys HMA 未分配
94h INT 67 常规内存和扩展内存区域重叠
  Himem.sys A20 线仍在启用
95h INT 67 逻辑页内的偏移量超过逻辑页的大小
96h INT 67 区域长度超过 1 Mb
97h INT 67 源和目标具有相同的句柄并重叠
98h INT 67 内存源或目标类型未定义
9Ah INT 67 指定的映射寄存器或 DMA 寄存器集不受支持
9Bh INT 67 所有映射寄存器或 DMA 寄存器集都被分配
9Ch INT 67 映射寄存器或 DMA 寄存器集不受支持
9Dh INT 67 未定义或未分配的映射或 DMA 寄存器集
9Eh INT 67 专用 DMA 通道不受支持
9Fh INT 67 指定的专用 DMA 通道不受支持
A0h INT 67 没有此句柄名称
  Himem.sys 所有扩展内存都被分配
A1h INT 67 找到的句柄没有名称或句柄名称重复
  Himem.sys 所有可用的扩展内存句柄都被分配
A2h INT 67 尝试绕过 1 M 常规地址空间
  Himem.sys 无效句柄
A3h INT 67 源数组已损坏
  Himem.sys 源句柄无效
A4h INT 67 操作系统拒绝访问
  Himem.sys 源偏移量无效
A5h Himem.sys 目标句柄无效
A6h Himem.sys 目标偏移量无效
A7h Himem.sys 长度无效
A8h Himem.sys 复制操作存在无效的重叠
A9h Himem.sys 发生奇偶校验错误
AAh INT 13 驱动器未就绪
  Himem.sys 块未锁定
ABh Himem.sys 块已锁定
ACh Himem.sys 块锁定计数溢出
ADh Himem.sys 锁定失败
B0h Himem.sys 仅可使用更小的 UMB
  INT 13 驱动器中未锁定卷
B1h Himem.sys 没有可用的 UMB
  INT 13 驱动器中已锁定卷
B2h Himem.sys UMB 段编号无效
  INT 13 卷不可移动
B3h INT 13 卷正在使用中,写入缓存未清空
B4h INT 13 锁定计数已超过
B5h INT 13 有效的弹出请求失败
B6h   介质为写保护
BBh INT 13 未定义的硬盘错误
CCh INT 13 硬盘写入故障
E0h INT 13 硬盘状态寄存器错误
FFh INT 13 硬盘上的检测操作失败
  INT 15 启用地址线 A20 错误
  其他 找不到匹配的文件,或没有更多文件,或 FCB 错误。
注释
  1. 如果错误代码在 AX 寄存器中返回,则其最高有效字节(在 AH 寄存器中)为零。
  2. ^ 与错误代码 22h 一起,介质标识符指针在 ES:DI 寄存器中返回。此介质标识符包含
    偏移量 00h - 12 字节:磁盘的卷标,以 00h 结尾;
    偏移量 0Ch - 1 双字:磁盘的序列号(以二进制形式)。
  3. HIMEM.SYS 驱动程序 (5.04-01) 将错误代码返回到 BL 寄存器。
  4. 最新执行的 DOS 函数返回的错误代码存储在 DOS 可交换数据区 SDA (A.01-3) 的偏移量 04h 处。BIOS 函数将其错误代码写入 BIOS 数据区 (A.01-1),很可能是在单元 0040:0074h 中。

A.06-2 错误类别代码

[edit | edit source]

INT 21\AH=59h 函数 (8.02-65) 在 BH 寄存器中返回的错误类别代码存储在 DOS 可交换数据区 SDA (A.01-3) 的偏移量 07h 处。错误类别代码的解释如下表所示。

代码 描述
01h 资源不足(存储空间或 I/O 通道)
02h 临时情况(文件或记录锁定)
03h 授权(拒绝访问)
04h 内部(系统软件错误)
05h 硬件故障
06h 系统故障(配置文件丢失或不正确)
07h 应用程序程序错误
08h 找不到对象
09h 格式错误
0Ah 对象已锁定
0Bh 介质错误
0Ch 对象已存在
0Dh 未知错误类别

A.06-3 建议的操作代码

[edit | edit source]

INT 21\AH=59h 函数 (8.02-5) 返回的建议操作代码存储在 BL 寄存器中,并存储在 DOS 可交换区域 SDA(A.01-3)的偏移量 06h 处。

代码 建议的操作
01h 重试
02h 稍后重试
03h 提示用户重新输入
04h 关闭已打开的文件,删除临时文件并中止
05h 立即中止
06h 忽略此错误
07h 在用户干预后重试

A.06-4 错误位置代码

[edit | edit source]

INT 21\AH=59h 函数 (8.02-65) 返回的错误位置代码存储在 CH 寄存器中,并存储在 DOS 可交换区域 SDA(A.01-3)的偏移量 03h 处。

代码 错误的可能位置
01h 未知或不合适
02h 块设备(磁盘错误)
03h 与网络相关
04h 连接到串行端口的设备(通道超时)
05h 与内存相关

A.06-5 I/O 错误状态代码

[edit | edit source]

INT 25 和 INT 26 处理程序 (8.02-85) 返回的错误状态代码存储在 AH 寄存器中。

代码 描述
01h 无效的命令
02h 无效的地址标记
03h 磁盘写保护(仅限 INT 26)
04h 未找到请求的扇区
08h DMA 失败
10h 数据错误(CRC 错误)
20h 控制器故障
40h 寻道操作失败
80h 设备未响应(超时)

A.07 执行服务结构

[edit | edit source]

A.07-1 程序段前缀

[edit | edit source]

当一个程序被加载到分配的内存段中执行时,程序的可执行代码被放置在偏移量 100h 及其之后。段的前一部分(偏移量 00h-FFh)被称为 PSP,即程序段前缀。它被填充了重要的服务数据,这些数据被 DOS 函数使用,并且可能被程序本身使用。

通过 DEBUG.EXE 可以最容易地查看 PSP,DEBUG.EXE 本身是由 COMMAND.COM 解释器创建的。图 11 展示了显示 PSP 部分内容的过程。该 PSP 的剩余部分被填充为零。

图 11

图 11 中的测试程序是 CJPEG.EXE 文件。参数 "-baseline" 和 "VC01.BMP" 被传递给测试程序,以作为从偏移量 5Ch 和 6Ch 开始的第一个和第二个 FCB 块填充示例。这些内容以及其他一些 PSP 数据字段的内容在下面的表格中解释。

偏移量 大小 描述
00h 2 INT 20 命令(用于 CP/M 兼容性)
02h 2 分配给程序的内存段之后的第一个段
06h 2 可执行代码的大小(用于 *.COM 文件)
0Ah 4 存储的 INT 22 终止地址
0Eh 4 存储的 INT 23 Ctrl-Break 处理程序地址
12h 4 存储的 INT 24 严重错误处理程序地址
16h 2 父 PSP 的段 [Note 1][Note 2]
18h 20 作业文件表 (JFT)[Note 3]
2Ch 2 当前进程环境的段
2Eh 4 最后一次调用 INT 21 时进入的 SS:SP
32h 2 JFT 中的条目数量(默认值为 20)
34h 4 指向 JFT 的指针(默认值为 PSP:0018h)
3Ch 1 = 00h (= 01h 用于象形文字键盘)
40h 2 INT 21/AH=30h 返回的 DOS 版本
50h 2 指向 INT 21 函数调度程序的调用
5Ch 16 第一个 FCB 区域 [Note 4]
6Ch 16 第二个 FCB 区域 [Note 4]
80h 1 命令行尾部的长度 [Note 5][Note 6]
81h 127 命令行尾部或 DTA 区域 [Note 5][Note 6]
注释
  1. ^ 如果偏移量 16h 处父 PSP 的段地址指向当前 PSP,则该程序被视为没有父进程,或者换句话说,它本身就是父进程。这是永久加载程序的显著特征,例如,命令解释器。永久加载程序无法通过调用 INT 20 或 INT 21\AH=4Ch 函数来终止。
  2. ^ 在保护模式下,一些 PSP 字段,包括偏移量 16h 处的 "父" 段字段,可能会被覆盖。因此,跟踪 PSP 引用链可能会变得混乱,除非每个候选 "父" PSP 段都确认存在典型的签名,例如,偏移量 00h 处的代码 CD20h (INT 20) 或偏移量 50h 处的代码 CD21h。
  3. ^ a b c 当当前程序启动时,它的 JFT(作业文件表,偏移量 18h)包含 SFT(A.01-4)条目编号(每个条目一个字节) — 用于 "已打开" 的对象,这些对象是从父进程继承的。JFT 中的空闲空间用 FFh 字节填充。JFT 中的值 80h-FEh 对应于由网络重定向器打开的远程文件。JFT 的默认大小 — 20 字节 — 对已打开对象的数量有限制。INT 21\AH=67h 函数 (8.02-76) 能够克服此限制:它在 PSP 之外安排一个更大的 JFT,替换 PSP 中偏移量 34h 处的 JFT 指针以及偏移量 32h 处的 JFT 条目数量。但是,子进程在任何情况下都无法从其父进程继承超过 20 个 "已打开" 的对象。
  4. ^ a b 偏移量 5Ch 和 6Ch 处的区域被填充为未打开的 FCB(A.09-5),其中包含从第一个和第二个命令行参数解析的数据。参数使用 INT 21\AX=2901h 函数 (8.02-19) 解析。参数的数量包括无法解析的参数。
  5. ^ a b "命令尾部" 区域 81h-FFh 被填充为命令行的副本,其中包含所有在命令名称之后的参数。填充的命令尾部区域部分以字节 0Dh 结束。填充部分的长度被写入偏移量 80h 处。如果长度被设置为 7Fh,并且偏移量 FFh 处的字节为 0Dh,则命令尾部的实际长度超过 126 字节,并且其未截断的版本应该在 CMDLINE 环境变量的值中找到。
  6. ^ "命令尾部" 区域 80h-FFh 被 "查找文件" 函数 INT 21\AH=11h,12h,4Eh,4Fh 用作默认的 DTA(数据传输区域)。您可以通过使用 INT 21\AH=1Ah 函数 (8.02-16) 更改 DTA 地址来防止 "命令尾部" 被覆盖。

A.07-2 加载程序的数据块

[edit | edit source]

下表显示了 INT 21\AX=4B00h 和 INT 21\AX=4B01h 函数 (8.02-53) 用于将程序加载到内存中以供进一步执行的数据块结构。

偏移量 大小 描述
00h 2 子进程的环境段 [Note 1]
02h 4 指向命令行的指针 [Note 2]
06h 4 指向偏移量 5Ch 处的 FCB 数据的指针 [Note 3]
0Ah 4 指向偏移量 6Ch 处的 FCB 数据的指针 [Note 3]
0Eh 4 返回:加载程序的堆栈顶 SS:SP [Note 4]
12h 4 返回:加载程序的入口点 CS:IP [Note 4]
注释
  1. ^ 父进程的整个环境将被复制到这个段中。如果子进程应该被赋予对父进程环境本身的访问权限,而不是副本,那么应该将 0000h 值分配给此数据块中偏移量 00h 处的字。
  2. ^ 命令行必须包含所有将被写入到子进程 PSP 的内容,从偏移量 80h 开始。[Note 5 to A.07-1] 命令行字符串必须以一个字节开头,指定其长度,并且必须以字节 0Dh 结尾。
  3. ^ 这个数据字符串将被复制到子进程 PSP 中相应 FCB 块的内部。[Note 4 to A.07-1] 表格 A.09-5 的 "N" 列显示了此数据字符串的所需结构。前 12 个字节应该被填充,然后是 4 个字节 00h。如果 FCB 应该保持为空,那么它的第一个字节必须是 00h,然后是 11 个字节 20h。
  4. ^ 偏移量 0Eh 和 12h 处的双字仅由 INT 21\AX=4B01h 函数返回。此函数加载程序,但不启动其执行。返回的堆栈顶和入口点允许稍后启动加载程序的执行。

A.07-3 执行状态描述符

[edit | edit source]

下表显示了 INT 21\AX=4B05h 函数 (8.02-54) 使用的执行状态描述符中的数据结构。

偏移量 大小 描述
00h 2 = 0000h (保留)
02h 2 标志 位 0 设置:程序为 *.EXE 格式
      位 1 设置:加载的代码为覆盖
04h 4 指向程序名称的指针,以 00h 字节结束
08h 2 加载程序的 PSP 段地址
0Ah 4 加载程序的入口点 CS:IP
0Eh 4 加载程序的大小(包括 PSP)

A.07-4 用于服务器函数的数据块

[edit | edit source]

由于服务器函数 INT 21\AX=5D00h (8.02-68) 能够将任何 INT 21 函数作为单独的进程执行,因此此数据块定义了执行所选函数所需的所有寄存器的状态。在调用所选函数之前,所有指定的状态将自动从数据块复制到寄存器中。

偏移量 大小 描述
00h 2 AX 寄存器的所需内容
02h 2 BX 寄存器的所需内容
04h 2 CX 寄存器的所需内容
06h 2 DX 寄存器的所需内容
08h 2 SI 寄存器的所需内容
0Ah 2 DI 寄存器的所需内容
0Ch 2 DS 寄存器的所需内容
0Eh 2 ES 寄存器所需的內容
10h 2 = 0000h (保留)
12h 2 虛擬機器識別碼 [注意 1]
14h 2 進程識別碼(即 PSP 段地址)
注释
  1. ^ 如果選擇的功能要在當前的 MS-DOS 7 下執行,則應將 0000h 值指定為虛擬機器識別碼。
  2. ^ 當此數據塊用於通過 INT 21\AX=5D01h 函數(8.02-69)關閉進程時,只考慮偏移量為 12h 和 14h 的字節,所有其他字節都將被忽略。

A.07-5 中斷共享協議

[編輯 | 編輯源代碼]

許多驅動程序和 TSR 程序加載它們的中斷處理程序,並且必須將此處理程序的地址寫入中斷表中的特定單元格。但是,此特定單元格可能已被先前加載的另一個處理程序的地址占用。如果新的處理程序必須替換舊的處理程序,則會出現如何釋放舊處理程序占用的內存的問題。如果新的處理程序補充了舊處理程序的功能,則會出現如何安排它們交互的問題。在這兩種情況下,解決方案是每個駐留模塊必須提供必要的數據,供以後可能加載的其他駐留模塊使用。

安排駐留模塊交互的第一步是 IBM 的中斷共享協議 (ISP),它規定存在一個 16 字節的數據塊,該數據塊相對於對應駐留模塊的調用地址具有固定位置。ISP 協議能夠形成一個可追溯的引用鏈,這些引用鏈指向所有共享公共中斷號的模塊。ISP 協議提供了改變鏈中引用順序並從鏈中刪除某些引用的機會。後者是卸載駐留模塊的必要條件。

根據 ISP 協議,寫入中斷表中的調用地址必須指向一個跳轉到 16 字節位置的短跳轉命令,在那裡開始駐留模塊的可執行代碼。跳過的那 16 字節僅是用於數據塊的空間。此數據塊的結構顯示在下表中。表中的所有偏移量都是從駐留模塊的調用地址開始計算的。

偏移量 大小 描述
00h 2 指向可執行代碼的短跳轉命令 (EBh 10h)
02h 4 處理程序鏈中前一個處理程序的地址
06h 2 簽名 4Bh 42h (= "KB")
08h 1 = 00h - 此處理程序不是第一個
    = 80h - 此處理程序是鏈中的第一個
09h 2 指向具有 RETF 命令的模塊卸載子程序的指針
0Bh 7 保留(必須為零)

注意 1:許多駐留模塊不符合 ISP 協議。為了防止引用鏈追蹤或駐留模塊卸載,可以有意忽略它。

A.07-6 備用多路複用中斷規範 (AMIS)

[編輯 | 編輯源代碼]

第 8.03 部分中描述的多路複用中斷 INT 2F 有一個嚴重的缺點:由於開發人員的決定不一致,有時會將重合的識別碼分配給不同的 TSR 模塊。為了避免此類衝突,有人提出了一個想法,即不要由模塊開發人員事先分配識別碼,而是在模塊加載過程中自動分配識別碼。據說這個想法的作者是 Ralf Brown。這個想法被備用多路複用中斷規範 (AMIS) 正式化,並由多路複用中斷 INT 2D 實施。本文的內容基於 AMIS 規範的 3.6 版。此外,每個使用多路複用中斷 INT 2D 的駐留模塊都必須符合 IBM 的中斷共享協議 ISP (A.07-5)。

根據 AMIS 規範,應在對多路複用中斷 INT 2D 進行循環調用的過程中搜索駐留模塊的識別碼,操作代碼 AL = 00h,並且 AH 寄存器中的候選識別碼從 AH = 00h 開始逐次遞增。如果任何已加載的駐留模塊認為 AH 寄存器中的特定候選識別碼是它自己的,它必須設置 AL = FFh,必須在 CH:CL 寄存器中返回其版本號,並且必須在 DX:DI 寄存器中返回指向長度不超過 80 字節的簽名的指針,以字節 00h 結束。當 AL 寄存器中返回的值為零時,搜索循環應終止:這意味著沒有已加載的駐留模塊已分配最後指定的候選識別碼。因此,後者是免費的,當前駐留模塊可以將此識別碼分配給自身。

為了找出特定駐留模塊是否已加載,應安排一個類似的循環,但具有其他終止條件。對於這個目的,由 DX:DI 寄存器中返回的地址指向的簽名起著主要作用。此簽名的前 16 字節足以識別駐留模塊。前 8 個字節必須指定公司或開發人員的名稱,後 8 個字節必須指定加載響應駐留模塊的程序或驅動程序的名稱。允許縮寫名稱。如果名稱短於 8 個字節,則應在末尾添加空格(字節 20h)。簽名中 16 個字節以外的其餘部分是可選的,但可以指定版本和其他有用數據。簽名檢查可以防止重複加載相同的駐留模塊。用於簽名檢查的搜索循環還會顯示分配給請求的駐留模塊的識別碼。當識別碼已知時,可以調用此駐留模塊的其他函數。

由於對多路複用中斷的調用需要通過引用鏈進行搜索,並且執行速度很慢,因此通過 INT 2D 對模塊的特定函數進行重複調用是不明智的(儘管允許使用操作代碼大於 10h 的調用)。使用 CALL FAR 命令(7.03-08)直接地址模塊的函數是可取的。為了獲取直接地址,應使用操作代碼 AL = 01h 和 AH 寄存器中的特定模塊識別碼調用一次 INT 2D 中斷。應保存 DX:BX 寄存器中返回的直接調用地址,然後以後就不再需要對多路複用中斷進行更多調用。

除了提到的操作代碼 AL = 00h 和 AL = 01h 的操作外,AMIS 規範還規定了其他一些操作,如以下表格所示。這些操作的統一代碼顯示在表格的第一列中,允許對所有駐留模塊應用相同的服務。某些操作是可選的。如果被地址的駐留模塊在 AL 寄存器中返回狀態代碼值 00h,則它不支持請求的操作。相反,返回的狀態代碼值 FFh 確認請求的操作受支持並已成功完成。幾個操作可能會返回其他狀態代碼值,通知有關駐留模塊的特定功能。這些以及 AMIS 操作執行的一些其他特性在以下表格後的註釋中進行了解釋。

代码 描述 注释
00h 安裝檢查
01h 請求直接地址 [注释 1]
02h 卸載駐留模塊 [注 2]
03h 請求 TSR 程序激活 [注 3]
04h 報告鏈式中斷 [注释 4]
05h 請求「熱鍵」列表 [注释 5]
06h 請求設備驅動程序信息 [注意 6]
  1. ^ 返回的狀態值 AL = 00h 意味著請求的駐留模塊無法使用 CALL FAR 命令進行地址訪問。DX:BX 寄存器中返回的地址的有效性必須由返回的狀態代碼值 AL = FFh 進行確認。
  2. ^ 卸載駐留模塊的請求必須在 DX:BX 寄存器中提供卸載操作完成後返回的地址,儘管駐留模塊可能會忽略此地址。AL 寄存器中返回的狀態代碼值(除 00h 和 FFh 外)具有以下含義:
    01 - 卸載嘗試失敗;
    02 - 卸載操作將在以後完成;
    03 - 模塊沒有卸載程序並保持活動狀態;
    04 - 與 03 相同,但模塊已停用;
    05 - 應在以後重複卸載嘗試;
    06 - 模塊已停用,但無法卸載;
    07 - 與 03 相同,以及需要卸載驅動程序。
    返回狀態代碼值 03、04 或 07 意味著需要啟動一個特殊的卸載程序。對於此程序,被地址的駐留模塊必須在 BX 寄存器中返回其可執行代碼加載到的段地址。
  3. ^ AL 寄存器中返回的狀態代碼值(除 00h 和 FFh 外)具有以下含義:
    01 - 激活嘗試應在以後重複;
    02 - 程序將在以後激活;
    03 - 程序目前處於活動狀態;
    04 - 激活嘗試失敗。
    成功激活後,由狀態代碼 FFh 確認,某些程序可能會在 BX 寄存器中報告額外信息。失敗後,由狀態代碼 04h 確認,額外信息可能會在 BX 和 CX 寄存器中返回。如果失敗的原因未知,則 BX 和 CX 寄存器應返回零。
  4. ^ 對操作 04h 的請求必須在 BL 寄存器中指定要檢查的中斷號(除 INT 2D 外)。AL 寄存器中返回的狀態代碼值(除 00h 外)具有以下含義:
    01 - 檢查結果無法確定;
    02 - 指定的中斷已被攔截;
    03 - 與 02 相同,以及處理程序地址 - 在 DX:BX 中;
    04 - 在 DX:BX 中 - 指向攔截列表的指針;
    FF - 指定的中斷未被攔截。
    狀態代碼值 04 意味著 BL 寄存器中指定的中斷號被忽略。返回的列表由每個中斷的 3 字節組成:第一個字節,中斷號;接下來的 2 個字節,該中斷處理程序入口地址的偏移量(在 DX 段內)。列表的末尾用中斷號位置的代碼 2Dh 標記。
  5. ^ 成功完成後,由狀態代碼 FFh 確認,在 DX:BX 寄存器中返回指向「熱鍵」列表的指針。此列表的結構在附錄 A.02-7 中描述。
  6. ^ 操作 06h 在 AL 寄存器中返回被地址的駐留模塊安裝的驅動程序數量,在 DX:BX 寄存器中返回 - 指向這些安裝的驅動程序中第一個的頭部的指針 (A.05-1)。在 AH 寄存器中返回一個標誌字節;此字節中的位 3-7 保留,必須為零。其餘標誌的設置狀態應解釋如下:
    位 0 - 驅動程序無法從內存中卸載;
    位 1 - 驅動程序未包含在 DOS 的驅動程序鏈中;
    位 2 - 安裝的驅動程序不可重入。
    如果被地址的 TSR 程序未安裝驅動程序,它必須返回 AL = 00h 值。返回時,AH、BX 和 DX 寄存器的內容可能會任意更改。

A.08 軟盤驅動器的數據結構

[編輯 | 編輯源代碼]

A.08-1 BIOS 數據區中的軟盤驅動器數據

[编辑 | 编辑源代码]

该表格展示了 BIOS 数据区域中与软盘驱动器相关的信息。所有偏移量均从段地址 0040h 开始计算,即从 BIOS 数据区域的起始位置开始。

偏移量 大小 描述
10h 2 标志 0 :软盘能够引导 PC
      6–7 :软盘驱动器数量减一
3Eh 1 位 7 由 IRQ6 处理程序设置,标志着 FDD 任务完成
3Fh 1 软盘驱动器中的电机状态
40h 1 软盘电机关闭超时计数
41h 1 状态 0–4 :上次操作错误 [注释 2]
      5 :通用控制器故障
      6 :寻道错误
      7 :驱动器未就绪
42h 3 软盘驱动器控制器寄存器
8Bh 1 软盘驱动器数据速率控制
8Fh 1 软盘驱动器注册
      0 :驱动器 0 支持 80 轨
      2 :驱动器 0 存在得到确认
      4 :驱动器 1 支持 80 轨
      6 :驱动器 1 存在得到确认
90h 1 软盘驱动器 0 介质状态
      0–2 =111b for 3.5" disks
      3 :软盘 2.88 Mb
      4 :已确定介质类型
      6–7 :当前数据传输速率
91h 1 软盘驱动器 1 介质状态(与驱动器 0 相同)
94h 1 软盘驱动器 0 当前磁道号
95h 1 软盘驱动器 1 当前磁道号
注释
  1. BIOS 数据区域中的数据放置可能取决于 BIOS 版本(A.01-1)。
  2. ^ 偏移量 41h 处的上次错误字节的特定值应根据 INT 13 的表 A.06-1 中所示进行解释。

A.08-2 访问和格式化参数

[编辑 | 编辑源代码]

计算机的 BIOS 系统将每个软盘驱动器的访问和格式化参数存储在单独的 11 字节表中。使用 INT 13\AH=00h 函数(8.01-49)可以获取任何特定软盘驱动器的表的指针。此外,还会为默认(“当前”)软盘驱动器创建一个类似的 11 字节表;指向该表的指针存储在中断表内的单元格 0000:0078h(也称为 INT 1E)中。

可以通过 INT 13\AH=18h 函数(8.01-54)更改访问和格式化参数,但这些更改要等到软盘控制器通过调用 INT 13\AH=00h(8.01-44)进行重置后才会生效。

偏移量 大小 描述
00h 1 参数,第一个字节
      7–4 :磁头移动步进速率
      3–0 :磁头卸载时间 (0Fh = 0.24 s)
01h 1 参数,第二个字节
      7–1 :磁头加载时间 (01h = 0.004 s)
      0 :设置状态表示通过 DMA 进行数据传输
02h 1 电机关闭延迟(以时钟滴答 1/18 秒为单位)
03h 1 每扇区字节数
      =00h 128 字节,
      =01h 256 字节,
      =02h 512 字节,
      =03h 1024 字节。
04h 1 每个磁道的扇区数
05h 1 扇区间隙长度
      =2Ah 适用于 5.25" 软盘,
      =1Bh 适用于 3.5" 软盘。
07h 1 格式化时扇区间隙长度
      =50h 适用于 5.25" 软盘,
      =6Ch 适用于 3.5" 软盘。
08h 1 格式化填充字节(默认值为 F6h)
09h 1 磁头稳定时间(毫秒)
0Ah 1 电机启动时间(滴答)(1 滴答 = 1/18 秒)

A.08-3 BIOS 注册的软盘驱动器类型

[编辑 | 编辑源代码]

BIOS 设置程序将有关已注册软盘驱动器的信息存储在 CMOS 内存的单元格 10h 中。为了读取这些数据,必须将单元格地址 10h 使用 OUT 命令(7.03-66)发送到端口 70h,然后可以使用 IN 命令(7.03-26)从端口 71h 读取所需的数据字节(有关更多信息,请参阅 A.14-1 的注释 1)。所需的数据字节出现在 AL 寄存器中;该字节中的位 4–7 指定第一个软盘驱动器的功能,位 0–3 指定第二个软盘驱动器的功能(如果存在)。每个 4 位组表示的十六进制值应根据下表独立解释。

软盘驱动器类型
0 软盘驱动器不存在
1 适用于 360 kb 5.25" 软盘的驱动器
2 适用于 1.2 Mb 5.25" 软盘的驱动器
3 适用于 720 kb 3.5" 软盘的驱动器
4 适用于 1.44 Mb 3.5" 软盘的驱动器
5 适用于 2.88 Mb 3.5" 软盘的驱动器

A.09 目录和文件数据表

[编辑 | 编辑源代码]

A.09-1 目录记录和文件数据

[编辑 | 编辑源代码]

有关文件、卷标和子目录的数据存储在相应的目录记录中。下表中的第一列“D”展示了具有“短”名称的对象的普通 32 字节目录记录中的数据结构。DOS 的“查找文件”函数 INT 21\AH=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)读取目录记录,并在 DTA 区域(8.02-16)中返回找到的数据;下表中的第二列“F4E”展示了这些函数返回的数据格式。其他“查找文件”函数 INT 21\AH=11h(8.02-11)和 INT 21\AH=12h(8.02-12)也返回 DTA 区域中的找到的数据,但格式不同。下表中的第三列“F1N”展示了使用普通 FCB 块(附录 A.09-5 中的“N”列)进行搜索请求后返回的数据格式。但如果搜索请求以扩展 FCB 块的形式呈现(附录 A.09-5 中的“E”列),则相同函数将返回其他数据结构,该数据结构显示在下表中的第四列“F1E”中。

D F4E F1N F1E 大小 描述
      00h 1 = FFh – 扩展 FCB 的签名
      06h 1 搜索属性(A.09-2)
  00h 00h 07h 1 磁盘:01h = A:,03h = C:,…[注释 1]
00h 01h 01h 08h 8 名称,后面追加空格以填充 8 个字节
08h 09h 09h 10h 3 后缀,后面追加空格以填充 3 个字节
  0Ch     1 搜索属性(A.09-2)
  0Dh     2 目录记录的序号
  0Fh     2 第一个目录簇的编号
0Bh 15h 0Ch 13h 1 对象的实际属性(A.09-2)
0Ch       1 辅助属性字节 [注释 2][注释 3]
0Dh   0Eh 15h 1 以 0.01 秒为单位的时间 [注释 2]
0Eh   0Fh 16h 2 对象创建时间 [注释 2]
10h   11h 18h 2 对象创建日期 [注释 2]
12h   13h 1Ah 2 上次访问日期
14h   15h 1Ch 2 起始簇编号 [注释 4]
16h 16h 17h 1Eh 2 上次更新时间
18h 18h 19h 20h 2 上次更新日期
1Ah   1Bh 22h 2 起始簇编号 [注释 4]
1Ch 1Ah 1Dh 24h 4 对象的字节大小(二进制形式)
  1Eh     13 对象的名称和后缀 [注释 5]
注释
  1. ^ 搜索函数 INT 21\AX=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)返回该字节,如果通过网络访问磁盘,则其第 7 位被设置。
  2. ^ 如果对象是在 DOS 下创建的,则该数据字段不会被填充。DOS 下的复制过程不会复制该字段中可能存在的数据。
  3. ^ 该数据字段由 Windows-2000/XP 操作系统使用,但作者没有关于这些数据作用的信息。
  4. ^ FAT-16 卷中对象的起始簇编号是偏移量 1Ah 处的字;偏移量 14h 处的字段未使用。但在 FAT-32 卷中,簇编号是双字。该双字的最高两位字节存储在偏移量 14h 处。
  5. ^ 搜索函数 INT 21\AX=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)不会覆盖偏移量 01h 处的名称搜索模板;找到对象的实际名称,以 00h 字节结尾,将返回到偏移量 1Eh 处。

A.09-2 属性字节的结构

[编辑 | 编辑源代码]

目录记录中偏移量 0Bh 处的属性字节(A.09-1)定义了与该记录关联的对象的类别。下表解释了属性字节的位字段。

描述
0 只读文件
1 隐藏文件
2 系统文件
3 卷标(对于文件和目录必须为零)
4 目录(对于文件和卷标必须为零)
5 要存储在存档中的文件
6,7 在 MS-DOS 下未使用,必须为零

注释 1:属性字节的 0Fh 值被认为是与具有“长”名称(A.09-3)的文件关联的 LFN 目录记录的签名。这些记录由 Windows-95/98/ME 操作系统创建。

注释 2:属性字节中位 3 和 4 的状态不能通过 INT 21\AX=4301h 函数(8.02-39)或 ATTRIB.EXE 实用程序(6.01)更改。

注释 3:文件搜索函数 INT 21\AX=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)忽略属性字节中位 0 和 5 的状态。

注释 4:扩展的“打开文件”函数 INT 21\AX=6C00h(8.02-78)在 CX 寄存器中接受一个属性字,其位 4 和 6-15 被清除。其他位的角色与表 A.09-2 中所示相同。

A.09-3 LFN 目录记录的格式

[编辑 | 编辑源代码]

每个由 Windows-95/98/ME 操作系统接受的“长”文件名至少占用几个标准大小为 32 字节的目录记录。在这些记录中的最后一个记录中存储了“长”文件名的截断版本;其结构与表 A.09-1 中所示相同。但与同一文件关联的其余记录存储了“长”文件名的 Unicode 字符。这些剩余的 LFN 记录具有其他结构,如下表所示。

偏移量 大小 描述
00h 1 LFN 记录的序号 [注释 1]
01h 10 “长”文件名字符的第一部分
0Bh 1 = 0Fh – LFN 记录的签名
0Ch 1 = 00h (保留)
0Dh 1 短文件名校验和 [注 2]
10h 12 "长" 文件名的第二部分字符
1Ah 2 = 0000h 适用于所有 LFN 记录
1Ch 4 "长" 文件名的第三部分字符
注释
  1. ^ 与同一“长”文件名关联的最后一个 LFN 记录,通过第一个字节中的第 6 位设置为 1 来标记。
  2. ^ 短文件名校验和字节是通过将短文件名的 11 个字节加起来计算的,在添加每个下一个字符字节之前,将中间结果向右旋转一位。

A.09-4 访问和共享字节的位域

[编辑 | 编辑源代码]

在准备访问对象时,INT 21\AH=3Dh (8.02-33) 和 INT 21\AX=6C00h (8.02-78) 函数接受一个访问条件字节。此字节被写入到相应的 SFT 条目中的偏移量 02h 位置的单元格 (A.01-4)。下表显示了访问和共享条件字节中位域的作用。

描述
1-0 访问条件
00b – 仅供读取
01b – 仅供写入
10b – 既可读取也可写入
11b – 用于执行和传输
2 如果设置为 1,则禁止更新文件的最后访问时间
3 = 0b (保留)
6-4 共享条件
000b – 兼容模式
001b – 禁止其他人访问
010b – 禁止其他人写入
011b – 禁止其他人读取
100b – 允许其他人完全访问
7 如果设置为 1,则文件句柄将不会被子进程继承。

注 1:除非加载 SHARE.EXE 实用程序,否则将忽略共享条件。

注 2:以前的 MS-DOS 版本要求第 2 位为 0。

A.09-5 未打开的文件控制块

[编辑 | 编辑源代码]

文件控制块 (FCB) 是对象属性规范的过时形式。它无法访问当前目录之外的对象,也无法访问具有 FAT-32 文件系统的磁盘。尽管如此,一些函数仍然使用部分填充的 (未打开的) FCB 作为对象搜索、重命名和删除的规范模板。与使用完全填充的 (已打开) FCB 块的操作不同,使用未打开的 FCB 的操作 (INT 21\AH=11h, 12h, 13h, 17h) 仍然在使用,并且可以应用于具有 FAT-32 文件系统的磁盘上的当前目录中的对象。下表显示了未打开的 FCB 的数据结构。

在 MS-DOS 7 中,允许两种形式的 FCB 块:长度不超过 36 字节的普通 FCB 块和长度不超过 43 字节的扩展 FCB。扩展 FCB 的一个显着特点是其第一个字节的值为 FFh。普通 FCB 块仅定义文件,除了那些具有“隐藏”和“系统”属性的文件。扩展 FSB 包括搜索属性规范,因此可以应用于不同的对象:文件、卷标和子目录。普通 FCB 和扩展 FCB 都可以完全填充 (已打开) 和部分填充 (未打开)。下表的“N”列显示了未打开的普通 FCB 块中的数据结构,“E”列显示了未打开的扩展 FCB 块中的相同结构。下表中未显示的那些 FCB 字节必须具有 00h 值。

N E 大小 描述
  00h 1 = FFh – 扩展 FCB 的签名
  06h 1 搜索属性规范 (A.09-2)
00h 07h 1 逻辑磁盘号:00h = “当前”磁盘,01h = A:,03h = C:,依此类推 (除了 FFh 值)。
01h 08h 8 对象的名称或其搜索掩码 [注 1]
09h 10h 3 对象的扩展名或其搜索掩码 [注 1]
0Ch 13h 1 返回时:搜索属性 (从偏移量 06h 开始)
0Dh 14h 2 返回时:目录中对象的记录号
0Fh 16h 2 返回时:当前目录的簇号
11h 18h 8 调用 INT 21\AH=17h 时:文件的新的名称
15h 1Ch 1 返回时:磁盘号 (01h=A:,03h=C:,依此类推)
19h 20h 3 调用 INT 21\AH=17h 时:文件的新的扩展名
注释
  1. ^ 在 FCB 中,名称和扩展名的所有字符都必须为大写。名称在其名义长度 8 个字节后附加空格 (20h),扩展名在其名义长度 3 个字节后附加空格。如果为空,则名称和扩展名字段都必须填充空格。上述以及一些其他填充 FCB 字段的要求可以通过 INT 21\AH=29h 函数 (8.02-19) 来满足。
  2. 第一次调用时,函数 INT 21\AH=11h (8.02-11) 和 INT 21\AH=13h (8.02-13) 要求在普通 FCB 中偏移量 0Ch 之后的所有字段和在扩展 FCB 中偏移量 13h 之后的所有字段的值为 00h。返回时,这些字段将包含数据,这些数据必须从每次之前的搜索调用完整地保留到每次接下来的搜索调用。在相同的 FCB 字段中,INT 21\AH=17h 函数 (8.02-14) 接受要重命名的文件的新的名称,需要为普通 FCB 提供长度为 28 个字节的缓冲区,为扩展 FCB 提供长度为 35 个字节的缓冲区。
  3. 未打开的 FCB 块不受 CONFIG.SYS 文件中的 FCBS 命令规范 (4.10) 限制。

A.09-6 CD 目录记录的规范结构

[编辑 | 编辑源代码]

High Sierra 和 ISO 9660 文件系统在 CD 目录记录中实现略微不同的数据结构。INT 2F\AX=150Fh 函数 (8.03-19) 可以将这两种数据结构都转换为一个通用的规范形式,如下所示。

偏移量 大小 描述
00h 1 属性记录的长度(以逻辑块为单位)
01h 4 文件的第一个逻辑块号
05h 2 文件的逻辑块大小
07h 4 文件的大小(以字节为单位)
0Bh 7 日期和时间
12h 1 位标志
13h 1 交织大小(仅限 AVI 文件)
14h 1 交织跳过因子(仅限 AVI 文件)
15h 2 卷集序列号
17h 1 文件名的长度
18h 38 文件名,以 00h 字节结尾
3Eh 2 文件版本号
40h 1 系统数据块中的字节数
41h 220 系统数据块

A.10 视频数据表

[编辑 | 编辑源代码]

A.10-1 选定的视频模式

[编辑 | 编辑源代码]

视频模式定义屏幕外观。BIOS 和 DOS 都使用文本视频模式:彩色视频模式 03h 或单色视频模式 07h。每个程序都可以设置最合适的视频模式,无论是文本模式还是图形模式。

可用的视频模式取决于 PC 的硬件。在硬件演进过程中,为了兼容性,一些视频模式已经变得很常见。后来,视频模式的一个子集获得了标准的地位。下表仅列出了那些几乎可以肯定被任何现代显卡支持的视频模式。内部内存不足的显卡可能无法支持高分辨率的图形视频模式。1991 年之前生产的过时的 PC 根本不支持 SVGA 视频模式。

EGA 和 VGA 视频模式由一个字节的代码定义,该代码在下面表格的第一列中指定。可以通过 INT 10\AH=00h 函数 (8.01-10) 设置这些视频模式。

SVGA 视频模式由 2 字节的十六进制代码定义,该代码应在 INT 10\AX=4F02h 函数 (8.01-37) 的 BX 寄存器中指定。下表没有指定 SVGA 视频模式代码的最高有效半字节,因为这个半字节 (位 15–12) 用于其他用途。其第 12 位和第 13 位必须为 0,第 14 位启用线性帧缓冲区访问,第 15 位强制保留视频内存内容。例如,如果要清除视频内存,可以指定 BX=0102h;如果要保留视频内存内容,可以指定 BX=8102h:在这两种情况下,您都将获得相同的视频模式,该模式在下面表格的第一列中指定为 102h。其他 SVGA 视频模式的代码以相同的方式显示——不指定最高有效半字节。非 SVGA 视频模式的代码可以在 INT 10\AX=4F02h 函数中 BX 寄存器的最低有效字节中指定,而其位 15 和 14 用于上述目的,位 13–8 设置为 0。

表格的第二列中将文本和图形单色视频模式标记为“b/w”(而不是颜色数)。

表格的第 3 列中将文本视频模式的特征描述为每行字符数和每屏幕高度的行数。例如,定义 80x25 表示您可以访问行 0–24 和每行中的字符单元格 0–79。所有列出的文本模式都接受 8x16 字体。

图形模式的特征描述为其以像素为单位的分辨率,显示在第 4 列中。例如,分辨率 640x480 表示您可以访问屏幕行 0–479 和每行中的像素 0–639。

表格的第 5 列显示了使用 UMB 地址空间中的固定视频缓冲区的那些视频模式的视频缓冲区起始地址。

视频模式 颜色 文本 图形 缓冲区
01h 16 40x25   B800 VGA
03h 16 80x25   B800 VGA
06h 黑白   640x200 B800 EGA,VGA
07h 黑白 80x25   B000 VGA
0Eh 16   640x200 A000 EGA,VGA
0Fh 黑白   640x350 A000 EGA,VGA
10h 16   640x350 A000 VGA
11h 黑白   640x480 A000 VGA
12h 16   640x480 A000 VGA
13h 256   320x200 A000 VGA
100h 256   640x400 *1 SVGA
101h 256   640x480 *1 SVGA
102h 16   800x600 *1 SVGA
103h 256   800x600 *1 SVGA
104h 16   1024x768 *1 SVGA
105h 256   1024x768 *1 SVGA
108h 16 80x60   *1 SVGA
109h 16 132x25   *1 SVGA
10Ah 16 132x43   *1 SVGA
10Bh 16 132x50   *1 SVGA
10Ch 16 132x60   *1 SVGA
110h 32k   640x480 *1 SVGA
111h 64k   640x480 *1 SVGA
112h 16M   640x480 *1 SVGA
113h 32k   800x600 *1 SVGA
114h 64k   800x600 *1 SVGA
115h 16M   800x600 *1 SVGA
116h 32k   1024x768 *1 SVGA
117h 64k   1024x768 *1 SVGA
118h 16M   1024x768 *1 SVGA
119h 32k   1280x1024 *1 SVGA
11Ah 64k   1280x1024 *1 SVGA
11Bh 16M   1280x1024 *1 SVGA
120h 256   1600x1200 *1 SVGA

注 1:SVGA 视频模式下,视频内存访问“窗口”在地址空间中的位置和大小可能取决于 PC 的硬件。应通过调用 INT 10\AX=4F01h 函数(8.01-36,A.10-7)确定视频内存访问参数。

注 2:当 SVGA 标准尚未被采用时,与 SVGA 的 102h 视频模式等效的是 6Ah 视频模式(800x600x16)。仍然可以通过 INT 10\AH=00h 函数(8.01-10)设置 6Ah 视频模式。

注 3:SVGA 标准为特殊视频模式保留了 BX=81FFh 代码,使能对视频内存的无限直接访问。

A.10-2 关于视频适配器状态的信息

[编辑 | 编辑源代码]

下表显示了 INT 10\AH=1Bh 函数(8.01-34)返回的 64 字节数据块的结构。此块显示有关视频适配器当前状态的信息。

偏移量 大小 描述
00h 4 静态功能表的地址(A.10-3)
04h 1 当前视频模式
05h 2 每行的列数或像素数
07h 2 刷新缓冲区的大小(以字节为单位)
09h 2 刷新缓冲区的起始地址
0Bh 16 页面 0–7 的光标位置(每个 2 字节)
1Bh 2 光标的起始和终止扫描线
1Dh 1 活动屏幕页
1Eh 2 CRT 控制器端口地址
20h 2 发送到端口 03x8h 和 03x9h 的最后值
22h 1 行数(或屏幕线数)减一
23h 2 每个字体字符的字节数
25h 1 活动视频适配器代码
26h 1 备用视频适配器代码(如果存在)
27h 2 视频模式的颜色数(0000h = 单色)
29h 1 视频模式支持的屏幕页数
2Ah 1 活动扫描线[注 1]
2Bh 1 字符生成器的主要字体块
2Ch 1 字符生成器的次要字体块
2Dh 1 当前状态标志[注 2]
31h 1 视频内存,00h–03h 分别对应于 64,128,192,256k
32h 1 标志,与表 A.10-3 中偏移量 0Eh 处的标志相同。
注释
  1. ^ 活动扫描线数由偏移量 2Ah 处的字节中一个位的设置状态定义。位 0、1、2、3、4、5、6 的设置状态分别对应于 200、350、400、480、512、600、768 的线数。
  2. ^ 偏移量 2Dh 处的标志字节中的位具有以下含义
    位 0 - 对视频模式选择的限制
    位 1 - 灰色叠加功能开启
    位 2 - 连接了单色显示器
    位 3 - 禁用默认调色板加载
    位 4 - 光标模拟启用
    位 5 - 颜色字节中的第 7 位的作用(A.10-5)
    位 6 - 不支持 9 点宽字体
    如果标志字节中的第 5 位被清除,则颜色字节中的第 7 位定义背景的亮度,否则定义闪烁。

A.10-3 静态功能表的格式

[编辑 | 编辑源代码]

静态功能表告知 PC 视频适配器可能支持的各种功能。INT 10\AH=1Bh 函数(8.01-34)在当前视频适配器状态表(A.10-2)的偏移量 00h 处返回指向静态功能表的指针。

偏移量 大小 描述
00h 7 位 0–13h 对应于视频模式 00h–13h;如果一位被设置,则相应的视频模式受支持。其余位保留用于 OEM 视频模式。
07h 1 位 0、1、2、3、4、5、6 表示支持扫描线数 200、350、400、480、512、600、768。
08h 1 文本视频模式中的最大字体数
09h 1 文本视频模式中的活动字体最大数
0Ah 2 支持的操作
位 0 - 所有显示器上的所有模式都支持
位 1 - 支持灰色叠加功能
位 2 - 支持字符字体加载功能
位 3 - 支持启用/禁用默认调色板加载
位 4 - 支持光标模拟功能
位 5 - 存在内部 EGA 调色板
位 6 - 存在彩色调色板
位 7 - 支持颜色寄存器分页功能
位 8 - 支持光笔(INT 10\AH=04h)
位 9 - 支持保存/恢复状态功能 1Ch
位 10 - 支持强度/闪烁切换(A.10-5)
位 11 - 支持多个视频适配器
0Eh 1 字体和调色板支持
位 0 - 支持 512 字符集
位 1 - 支持动态确定保存区域
位 2 - 支持文本字体覆盖
位 3 - 支持图形字体覆盖
位 4 - 支持调色板覆盖
位 5 - 支持视频适配器代码扩展

A.10-4 BIOS 关于 SVGA 扩展的信息

[编辑 | 编辑源代码]

下表显示了 INT 10\AX=4F00 函数(8.01-35)返回的 512 字节长数据块中的选定数据。这些数据描述了视频适配器的固定存储芯片中提供的软件。

偏移量 大小 描述
00h 4 签名“VESA”或“VBE2”
04h 2 SVGA BIOS 扩展的版本号
06h 4 指向制造商(OEM)名称的指针
0Eh 4 指向支持的视频模式列表的指针(结束标记 FFFFh)
12h 2 视频内存的大小(以 64 kb 块为单位)

A.10-5 16 色代码

[编辑 | 编辑源代码]

虽然 AT 兼容计算机的硬件建议了各种各样的视频模式,但 BIOS 和 MS-DOS 7 的默认视频模式都是 16 色 80x25 文本视频模式 03h。对于此视频模式和所有其他 16 色视频模式(A.10-1),颜色由 4 位代码定义,如下表所示。

0000 0 黑色 1000 8 灰色
0001 1 蓝色 1001 9 亮蓝色
0010 2 绿色 1010 10 亮绿色
0011 3 青色 1011 11 亮青色
0100 4 红色 1100 12 亮红色
0101 5 洋红色 1101 13 亮洋红色
0110 6 棕色 1110 14 黄色
0111 7 白色 1111 15 亮白色

颜色代码用于组合颜色字节,也称为显示属性字节。文本视频模式下的视频内存充满了交替的颜色字节和字符字节。在每个颜色字节中,位 3–0 定义前景色(字符的)颜色,位 6–4 定义背景色。默认情况下,第 7 位定义字符的闪烁而不是背景的亮度,但第 7 位的作用可以通过 INT 10\AX=1003h 函数(8.01-23)重新编程,然后两个 4 位组中的最高有效位将具有相同的任务。默认情况下,第 3 位定义前景色亮度,但此作用也可以通过 INT 10\AX=1103h 函数(8.01-28)重新编程,然后第 3 位将重定向字符生成器到另一个字体块,从而能够同时从两个字体显示字符。

A.10-6 BIOS 数据区中的视频数据字段

[编辑 | 编辑源代码]

下表显示了 BIOS 数据区中与计算机视频子系统相关的选定项目。表中所有偏移量都从 BIOS 数据区的开头(A.01-1)计算,该数据区的段地址为 0040h。

偏移量 大小 描述
10h 2 位 5–4 定义初始视频模式
00b 根据视频适配器设置
01b 40x25 文本 CGA 彩色模式
10b 80x25 文本 CGA 彩色模式
11b 80x25 单色文本模式
49h 1 当前视频模式(A.10-1)
4Ah 2 每屏幕宽度的列数(或像素数)
4Ch 2 视频缓冲区的屏幕页大小(以字节为单位)
4Eh 2 视频缓冲区中当前页的起始地址
50h 16 每个 8 个视频页上的光标 XY 位置
60h 2 光标起始和结束扫描线(INT 10/AH=01h)
62h 1 活动屏幕页号
63h 2 CRT 控制器基本 I/O 端口地址(通常为 03D4h)
65h 1 发送到端口 03B8h/03D8h 的最后一个控制字节值
位 5 – 闪烁控制(INT 10\AX=1003h)
66h 1 最后发送到 I/O 端口 03D9h 的控制字节值
位 4 – 背景亮度
84h 1 屏幕上的行数(或线数)减一
85h 2 字体高度(以扫描线为单位)
87h 5 视频适配器控制标志
位 0: – 光标模拟禁用
位 1: – 连接了单色显示器
位 2: – 等待 CRT 显示器启用
位 7: – 在设置视频模式时不要清除 RAM
A8h 4 指向 VGA 视频指针表的指针

注 1: 显示的数据位置可能取决于 BIOS 版本(A.01-1)。

A.10-7 请求的 SVGA 视频模式的功能

[编辑 | 编辑源代码]

此表显示了来自 256 字节数据块的选定数据,该数据块由 INT 10\AX=4F01 函数(8.01-36)在响应关于计算机硬件支持的任何 SVGA 视频模式的请求时返回。

偏移量 大小 描述
00h 2 标志 位 0 – 请求的视频模式受支持
      位 2 – 支持函数 8.01-21、8.01-33
      位 3 – 为彩色视频模式设置
      位 4 – 为图形视频模式设置
      位 5 – 视频模式不同于 VGA 标准
      位 6 – 不支持内存库切换
      位 7 – 支持线性帧缓冲区
02h 1 窗口“A”
      位 0 – 滑动窗口“A”处于活动状态
      位 1 – 窗口“A”可读
      位 2 – 窗口“A”可写
03h 1 窗口“B”: 与偏移量 02h 的窗口“A”相同
04h 2 窗口“A”、“B”在视频内存中的移位步长(以 kb 为单位)
06h 2 滑动窗口“A”和“B”的大小(以 kb 为单位)
08h 2 窗口“A”在 CPU 地址空间中的段地址
0Ah 2 窗口“B”在 CPU 地址空间中的段地址
0Ch 4 用于滑动窗口定位程序的直接调用地址,类似于 INT 10\AX=4F05h(8.01-39)
10h 2 每行视频内存的字节数
12h 2 图形视频模式的屏幕行长度(以像素为单位)或文本视频模式的字符单元长度
14h 2 图形视频模式的屏幕高度(以像素为单位)或文本视频模式的字符单元高度
16h 1 字符单元宽度(以像素为单位)
17h 1 字符单元高度(以像素为单位)
18h 1 视频内存平面的数量
19h 1 每个像素的视频内存位数
1Ah 1 视频适配器内存库的数量
1Bh 1 视频内存填充模型
00h 文本、备用字符和颜色字节
03h 16 色图形 EGA 模型
04h 具有“打包”像素的图形模型
06h 每个像素 3 个颜色字节(HiColor)
07h 亮度-色度模型 (YUV/YIQ)
1Ch 1 视频内存库大小(以千字节为单位)
1Dh 1 屏幕页面的数量
28h 4 线性视频缓冲区的物理地址 (VBE v2.0)

A.11 PC 的硬件规格

[编辑 | 编辑源代码]

A.11-1 硬件配置字

[编辑 | 编辑源代码]

硬件配置字由 INT 11 处理程序(8.01-42)返回;它在 BIOS 数据区域(A.01-1)中的地址 0040:0010h 处读取此字(确切地址可能取决于 BIOS 版本)。硬件配置字中的位字段应根据下表进行解释。

描述
0 PC 可以从现有的软盘驱动器启动
1 存在数学协处理器
2 连接了 BIOS 控制的指向设备(鼠标)
4-5 初始视频模式代码 (A.10-1)
6-7 软盘驱动器数量减一(如果位 0 设置)
9-11 可用串行端口(COM 端口)的数量
12 存在游戏端口(用于操纵杆)
13 存在内部调制解调器
14-15 可用并行端口(LPT 端口)的数量

A.11-2 用于 HIMEM.SYS 驱动程序的 PC 模型标识符

[编辑 | 编辑源代码]

为了启用对计算机扩展内存的访问,HIMEM.SYS 驱动程序 (5.04-01) 必须确定 CPU 模型。但是,在某些计算机上,HIMEM.SYS 无法正确确定 CPU 模型,因此,应在驱动程序的命令行中显式指定计算机标识符或其数字代码。

下表显示了至少对于 HIMEM.SYS 驱动程序的某些版本无法确保 CPU 确定的计算机的标识符和相应的数字代码。此表中的第一个位置(代码 1)是一个例外:IBM AT 是一个可确定的模型,它代表默认选择。HIMEM.SYS 驱动程序的最新版本能够正确检测此表中指定的大部分 PC 类型,除了 Acer 1100、Wyse 和 IBM 7552 之外。

标识符 代码 PC 模型
at 1 IBM PC AT 及兼容模型
ps2 2 IBM PS/2
ptlcascade 3 Phoenix Cascade BIOS
hpvectra 4 HP Vectra (A & A+)
att6300plus 5 AT&T 6300 Plus
acer1100 6 Acer 1100
toshiba 7 东芝 1600 & 1200XE
wyse 8 Wyse 12.5 兆赫 286
tulip 9 Tulip SX
zenith 10 Zenith ZBIOS
at1 11 由 IBM 保留
at2 12 由 IBM 保留
css 12 CSS Labs
at3 13 由 IBM 保留
philips 13 飞利浦
fasthp 14 HP Vectra
ibm7552 15 IBM 7552 工业计算机
bullmicral 16 Bull Micral 60
dell 17 戴尔 XBIOS

A.11-3 键盘控制器

[编辑 | 编辑源代码]

键盘控制器是计算机主板上的一个芯片。尽管键盘控制器的类型可能不同,但在所有 AT 兼容计算机中,它们的任务和接口都是统一的。CPU 和键盘控制器之间的主要交互通过端口 60h 和 64h 进行。

端口 64h 始终通过 IN 命令 (7.03-26) 打开,以便读取键盘控制器的当前状态。从端口 64h 读取的状态字节中的位的状态应解释如下

位 7 – 从键盘发送的数据中发生错误
位 6 – 键盘没有响应控制器
位 4 – 键盘被 ADh 命令阻塞
位 2 – 键盘的自检已成功
位 1 – 上一次操作尚未完成
位 0 – 准备好在端口 60h 中读取键码

在每次按键和每次按键释放时,键盘控制器都会在端口 60h 中显示转换后的键码,并且紧随其后的是通过端口 64h 中的位 0 和控制器的输出线的位 4 来宣布其准备就绪状态。[注 1] 后者信号会调用 INT 09 处理程序 (8.01-09),该处理程序会从端口 60h 读取准备好的字节。对端口 60h 的每次读取访问都会清除端口 64h 中的位 0。

此外,端口 64h 接收使用 OUT 命令 (7.03-66) 发送给键盘控制器的操作代码。由于键盘控制器比 CPU 慢得多,因此在发送操作代码之前,CPU 必须等到从同一端口 64h 读取的状态字节中的位 1 被清除:这将表示键盘控制器已完成其先前的操作,并准备好接收下一个操作代码以执行。下表显示了可能发送给键盘控制器的端口 64h 的一些重要操作的代码。

代码 操作
ADh 阻塞键盘(关闭它)
AEh 激活键盘(打开它)
D1h 打开端口 60h 用于数据接收[注 1]
EDh 打开端口 60h 用于数据接收[注 2]
FEh 向 CPU 发送复位信号[注 3]
注释
  1. ^ a b 键盘控制器通过端口 64h 接收到操作代码 D1h 后,开始等待通过端口 60h 接收数据字节,然后将接收到的数据字节传输到其输出总线。数据字节的位以以下方式分配到输出总线线路上
    位 7 – 通过数据线向键盘输出命令;
    位 6 – 通过时钟线向键盘输出时钟;
    位 4 – 通过 IRQ 1 线调用 INT 09 (8.01-09);
    位 1 – 连接到 CPU 地址线 A20 的门控;
    位 0 – 连接到 CPU 的复位引脚。
    控制器的输出线的活动状态对应于数据字节中位位的清除状态;因此,不允许发送具有清除位 0 的数据字节——CPU 将被阻塞。由于相同的原因,为了打开 A20 线门控,应将数据字节 FFh 发送到端口 60h,为了关闭对 HMA 的访问,应发送数据字节 FDh。
  2. ^ 键盘控制器在通过端口 64h 接收操作码 EDh 后,开始等待通过端口 60h 接收数据字节,然后将接收到的数据字节的位状态传输到键盘 LED 指示灯的控制线,具体来说:
    位 2 – 传输到 Caps Lock 指示灯;
    位 1 – 传输到 Num Lock 指示灯;
    位 0 – 传输到 Scroll Lock 指示灯。
    如果数据字节中相应的位被设置,指示灯将被点亮。此数据字节中未提及的位必须被清除。
  3. ^ 键盘控制器在通过端口 64h 接收操作码 F0h–FFh 后,将该操作码的最低四位发送到其输出总线的线 3–0。与接收操作码 D1h 的响应不同,在接收操作码 F0h–FFh 后,输出线的强制状态不会永远保持,而是作为单个脉冲保持大约 6 毫秒。具体来说,操作码 FEh 会导致发送到 CPU 重置引脚的脉冲,就像在计算机系统机箱前面板上按下重置按钮后一样。一些影响 CPU 重置后进一步事件的方法在 [注释 4 到 A.12-1] 中描述。

A.11-4. CPU 的标志寄存器

[编辑 | 编辑源代码]

在现代处理器中,从 80386 型号开始,以前 16 位的标志寄存器已扩展到 32 位;此外,还引入了控制寄存器 CR0、CR2 和 CR3。后来,从奔腾 CPU 开始,又添加了一个控制寄存器 CR4。除了 CR2,所有上述控制寄存器中都存在标志:它存储对禁止内存页面请求访问的最后一个命令的线性地址。标志寄存器中标志以及控制寄存器中一些标志的功能如下表所示。

寄存器 描述 注释
标志 00h CF – 进位标志 [注释 1]
标志 02h PF – 最低有效字节中位的奇偶校验 [注释 1]
标志 04h AF – 中间进位标志 [注释 1]
标志 06h ZF – 零(或相等)标志 [注释 1]
标志 07h SF – 符号标志 [注释 1]
标志 08h TF – 跟踪(单步)标志
标志 09h IF – 中断允许标志 [注释 1]
标志 0Ah DF – 索引计数方向标志 [注释 1]
标志 0Bh OF – 溢出标志 [注释 1]
标志 0Ch I/O 权限级别 2 位字段 [注 2]
标志 0Eh 嵌套任务标志 [注 3]
标志 0Fh CPU 8086 的特征 [注 3]
EFLAGS 10h 忽略调试标志 (A.11-5) [注释 4]
EFLAGS 11h VM – V86 模式标志 [注释 4][注释 5]
EFLAGS 12h AC – 对齐检查允许标志 [注释 4][注释 6]
EFLAGS 13h VIF – 虚拟中断标志 [注释 4]
EFLAGS 14h VIP – 虚拟中断挂起 [注释 4]
EFLAGS 15h ID – CPU 标识标志 [注释 3][注释 4]
CR0 00h PE – 保护允许标志 [注释 7]
CR0 01h 协处理器同步 (7.02-05) [注释 7]
CR0 02h 通过 INT 07 模拟协处理器 [注释 7]
CR0 03h TS – 任务切换标志 [注释 7]
CR0 04h 协处理器命令支持 [注释 7]
CR0 05h 协处理器错误时启用异常 [注释 7]
CR0 10h WP – 写保护 [注释 7][注释 8]
CR0 12h AM – 对齐掩码 [注释 7][注释 6]
CR0 1Dh NW – 非写入直通缓存 [注释 7]
CR0 1Eh CD – 缓存禁用 [注释 7]
CR0 1Fh PG – 分页启用 [注释 7]
CR3 03h 缓存写入直通 [注释 7][注释 9]
CR3 04h 页面缓存禁用 [注释 7][注释 9]
CR4 00h VME – V86 模式扩展启用 [注释 7]
CR4 01h PVI – 虚拟中断启用 [注释 7]
CR4 02h TSD – 时间戳禁用 [注释 7]
CR4 03h 调试:允许端口调用时 INT 01 [注释 7]
注释
  1. ^ 此标志的功能和状态在第 6.05-15 节中描述。
  2. ^ 标志寄存器中的位 0Ch 和 0Dh 表示执行 I/O 操作所需的权限级别。默认情况下,在 DOS 下,位 0Ch 和 0Dh 都被设置:因此,所有进程都允许直接 I/O 操作。但是,只有具有最高(零)权限级别的进程才能使用 POPF 命令(7.03-68)更改 0Ch 和 0Dh 位的状态。后者功能使能够确定当前进程是否确实在最高权限级别执行。
  3. ^ 标志寄存器使能够对 CPU 类型进行粗略识别。无法清除 0Fh 标志是过时的 8086 CPU 的特征。无法设置 0Eh 标志是 16 位处理器的特征。如果 CPU 能够设置 0Eh 标志,则它是一个 32 位 CPU,并配备了扩展的 EFLAGS 寄存器。在这种情况下,EFLAGS 寄存器中的位 15 将显示此 CPU 是否能够正确响应 CPU 识别命令 (CPUID,机器码 0Fh A2h)
  4. ^ a b c EFLAGS 是 16 位标志寄存器的 32 位扩展。在实模式下,可以使用 PUSHF 和 POPF 命令访问 EFLAGS 的位 31–16,前提是这些命令之前有前缀 66h,如第 7.02-06 节所述。
  5. ^ 使用 POPF 命令设置 V86 模式的机会被硬件阻止。但是,如果 CPU 处于保护模式,并且同时段描述符中的第 06 位允许 32 位寻址 (A.12-2),则可以使用 IRET 命令从堆栈设置 V86 模式。
  6. ^ 此处对齐意味着内存中每个操作数的地址必须是该操作数大小(以字节为单位)的倍数。对齐检查只能在 CPU 处于保护模式时在最低(第三)权限级别执行(注释 1 到 8.01-42)。即使 EFLAGS 寄存器中的 AC 标志未启用这些异常,CR0 中的对齐掩码位也会启用对齐异常。
  7. ^ 控制寄存器可以使用 MOV 命令访问(注释 1 到 7.03-58)。此外,可以使用 INT 67\AX=DE07h 函数 (8.03-72) 读取 CR0 寄存器的内容。
  8. ^ 位 10h 用于保护应用程序程序段免受写入操作系统或可能具有更高权限级别的其他进程的访问。
  9. ^ CR3 寄存器的最高 20 位存储页面目录的基地址。此基地址必须是页面大小(通常为 4 kb)的倍数。对 CR3 寄存器的每次写入操作都会导致更新 TLB 缓冲区的内容;这应该在每次更改页面地址转换表时完成。

A.11-5 CPU 的调试寄存器

[编辑 | 编辑源代码]

调试寄存器使能够在每次访问特定目标时调用 INT 01 处理程序(8.01-02):端口或规定的内存区域,包括地址空间的不可写区域,在这些区域中无法存储断点。从 80386 型号开始,所有 x86 平台的现代处理器都配备了调试寄存器 DR0–DR7。可以使用 INT 67\AX=DE08h-DE09h 函数 (8.03-73) 以及 MOV 命令(注释 1 到 7.03-58)访问调试寄存器。

寄存器 DR0–DR3 存储四个 32 位规定的目标点的绝对线性地址。DR7 寄存器定义访问事件注册的条件。DR6 寄存器存储发生的访问事件的一些情况(可编程和外部中断不影响 DR6 的内容)。DR6 和 DR7 寄存器中选定位字段的功能如下表所示。

寄存器 描述 注释
DR6 00h 事件在 DR0 地址发生 [注释 1]
DR6 01h 事件在 DR1 地址发生 [注释 1]
DR6 02h 事件在 DR2 地址发生 [注释 1]
DR6 03h 事件在 DR3 地址发生 [注释 1]
DR6 0Dh 检测到断点调试访问 [注释 1]
DR6 0Eh BS – 检测到单步状态 [注释 1]
DR6 0Fh TS – 检测到任务切换状态 [注释 1]
DR7 00h DR0 的 2 位权限字段 [注 2]
DR7 02h DR1 的 2 位权限字段 [注 2]
DR7 04h DR2 的 2 位权限字段 [注 2]
DR7 06h DR3 的 2 位权限字段 [注 2]
DR7 0Dh GD – 通用检测启用 [注 3]
DR7 10h DR0 的 4 位控制字段 [注释 4]
DR7 14h DR1 的 4 位控制字段 [注释 4]
DR7 18h DR2 的 4 位控制字段 [注释 4]
DR7 1Ch DR3 的 4 位控制字段 [注释 4]
注释
  1. ^ 即使 DR7 寄存器中的位 0Dh 或 EFLAGS 寄存器中的位 10h (A.11-4) 不允许生成异常,访问事件也会在 DR6 寄存器的位 01h–03h 中固定。DR6 寄存器中的位 0Eh 固定访问事件发生时的 TF 标志状态;位 0Fh 固定任务切换状态。DR6 寄存器中位 0Dh 的设置状态提醒,即使访问事件已发生(位 0Dh 被异常清除),但异常尚未生成。
  2. ^ 权限字段定义注册访问事件的本地权限或全局权限。权限字段中的第一个位仅在当前任务内局部起作用,并在每次任务更改时关闭。权限字段中的第二个位赋予全局属性,并使能够在当前任务之外注册访问事件。
  3. ^ DR7 寄存器中的位 0Dh 不影响访问事件注册,而是允许生成由访问事件引起的异常。DR7 中位 0Dh 的状态无法更改,除非进程具有最高权限级别或在实模式下执行。
  4. ^ 每个控制字段中的第一对位定义应拦截的访问事件的类型
    00 – 尝试执行机器码
    01 – 尝试写入内存
    10 – 到端口的 I/O 地址(对于奔腾+ CPU)
    11 – 读写尝试。
    每个控制字段中的第二对位定义监视地址空间的大小:字节、字或双字。尝试访问监视地址空间中的任何字节都被视为访问事件。

A.12 内存分配和管理

[编辑 | 编辑源代码]

A.12-1 通用内存映射

[编辑 | 编辑源代码]

此表显示了 1 Mb 以下内存空间的通用分配,这对于 AT 兼容计算机来说是典型的,受 DOS 操作系统控制。但是,内存分配取决于 BIOS 版本、BIOS 设置设置和特定计算机的配置。因此,您计算机中内存分配的一些特征可能与下面显示的不同。

地址 大小 描述
0000:0000 400h 实模式中断表
0000:0074 4 指向视频寄存器默认设置的指针
0000:0078 4 指向默认软盘数据表的指针 (A.08-2)
0000:007C 4 指向 8x8 图形字体字符 80–FFh 的指针
0000:0104 4 指向第一个硬盘参数表(A.13-1)的指针
0000:010C 4 指向当前图形字体的指针 (8.01-30)
0000:0118 4 指向第二个硬盘参数表(A.13-1)的指针
0040:0000 100h BIOS 数据区 (A.01-1)
0050:0000 1 INT 05 的打印机状态 (8.01-06)
0050:0004 1 软盘驱动器选择 (A: 或 B:)
0050:0040 BCh 指向原始中断处理程序的选定指针 [注释 6]
0000:7C00 200h 加载和执行引导记录的默认区域
9000:FFFF "传统"内存的上边界 [注释 1]
A000:0000 10000h 视频内存访问“窗口” [注释 2]
B000:0000 10000h 视频内存访问“窗口” [注释 2]
B800:0000 8000h 文本视频模式 EGA+ 的视频缓冲区
C000:0000 8000h 视频适配器的 BIOS 区域 [注释 3]
C000:0070 7 "EXTMODE" 签名:支持 SVGA 视频模式
C800:0000 4000h 硬盘的 BIOS 区域
D000:0000 10000h UMB 的默认区域,由 EMM386.EXE 安排
E000:0000 10000h 扩展内存页的默认区域
F000:0000 FFFFh PC 的 ROM BIOS 的重新定位副本 [注释 3]
F000:FFF0 重新启动程序的入口点 [注释 4]
F000:FFF5 8 BIOS 日期
F000:FFFD 1 BIOS 代码校验和
F000:FFFE 1 计算机的型号代码
FFFF:0010 FFEFh 高内存区域 [注释 5]
注释
  1. ^ 传统内存的 640 kb 边界是由主板芯片组中的动态内存控制器芯片硬件定义的。在这个边界之上,接下来的 384 kb 地址空间被保留用于视频内存和 BIOS ROM 芯片。由于 CPU 中的地址转换机制,这个区域中的空闲空间通常在保护模式下变得可访问。
  2. ^ a b 地址空间区域 A000:0000–B000:FFFF 提供对视频内存的访问。这个区域的具体使用方式取决于视频模式 (A.10-1)。现代视频适配器的 SVGA BIOS 在这个区域中安排了一个或两个“滑动”窗口,提供对大型视频内存中选定部分的“滑动”访问(详细信息见第 8.01-39 节)。
  3. ^ a b 可以通过相同的地址空间区域直接访问 ROM 芯片中的 BIOS 和视频 BIOS 代码,或者访问这些代码在速度更快的 RAM 中的副本。选择特定替代方案取决于由 BIOS 设置程序设置的相应内存区域的“阴影”参数设置。
  4. ^ a b c d e 重新启动程序的入口点地址 F000:FFF0h 是由 CPU 硬件定义的:在开机时,其地址总线的初始状态恰好是 FFFF0h。进一步的引导过程取决于 BIOS 的 CMOS RAM 中字节 0Fh 中写入的值[注释 1 到 A.14-1]
    00h – 带有 POST 测试的普通引导
    04h – 重新启动并调用 INT 19 (8.01-90)
    05h – 重置并跳转到 0040:0067 单元格中的地址 (A.01-1)
    0Ah – 跳转到 0040:0067 单元格中准备的地址 (A.01-1)
    与开机后的引导不同,重新启动后的 POST 测试取决于地址 0040:0072h 的字[注释 1 到 A.01-1]。在重新启动后,只有 05h 和 0Ah 两种选择,它们的区别在于中断控制器是否会被重置。
  5. ^ 当段地址与偏移量相加产生进位位时,会访问高内存区域,该进位位被导向地址总线的 A20 线。高内存区域在实模式下可访问,但需要安装 HIMEM.SYS 驱动程序 (5.04-01),该驱动程序提供对 A20 线门的控制。
  6. ^ 0050:0040–0050:00FB 区域存储选定中断处理程序地址的副本(INT 00 – INT 1F,INT 40 – INT 43,INT 46,INT 70 – INT 77),由 BIOS 为随后加载操作系统而准备。在主中断表中,这些地址可能会被其他处理程序的地址覆盖,这些处理程序是后来安装的,可能是由 MS-DOS 7 本身、TSR 程序或驱动程序安装的。

A.12-2 段描述符

[编辑 | 编辑源代码]

在保护模式下,段边界和访问权限由段描述符定义。许多最重要的段描述符构成全局描述符表 (GDT)。CPU 转换到保护模式意味着存在一个 GDT,至少在 CPU 处于实模式时,要预先准备一部分。准备好的 GDT 中描述符的顺序和选择取决于该过程的要求,该过程应该控制 CPU 转换到保护模式。

不同过程的 GDT 表示例显示在文章 8.01-76、8.01-78 和 9.10-01 中。在所有 GDT 表中,第一个描述符必须用零填充:它是未请求的段和内存页的模板。所有描述符都具有相同的内部结构,如下表所示。最低

偏移量 大小 描述
00h 2 段大小的最低 2 个字节,最小的字节在前
02h 3 基本地址的最低 3 个字节,最小的字节在前
05h 1 访问权限字节 [注释 2]
    位 0 = 0 – 段尚未被访问
      = 1 – 段已被访问
    位 1 = 0 – 仅数据读取或代码执行
      = 1 – 允许数据写入和代码读取
    位 2: – 扩展方向 [注释 3]
    位 3 = 0 – 段包含数据
      = 1 – 段包含可执行代码
    位 4 = 0 – 系统描述符的标记
      = 1 – 应用程序描述符的标记
    位 5–6: – 权限级别
      = 00 – 最高
      = 11 – 最低
    位 7 = 0 – 段必须从磁盘读取
      = 1 – 段存在于 RAM 中
06h 1 位 0–3: – 段大小的最高 4 位
    位 4: – 空闲位 [注释 4]
    位 5 = 0 (保留)
    位 6: – 地址和操作数的大小 [注释 5]
      = 0 – 16 位寻址和操作数
      = 1 – 32 位寻址和操作数
    位 7: – 粒度位
      = 0 – 段大小以字节为单位
      = 1 – 段大小以 4 kb 为单位
07h 1 基本地址的最高字节
注释
  1. ^ 段描述符的字节 06h 和 07h 被 80386 及更高版本的 CPU 模型考虑。如果程序预计将由 80286 CPU 执行,那么字节 06h 和 07h 必须被清除。字节 06h 和 07h 为零是保护模式 16 位程序的显著特征,使它们能够被 32 位 CPU 模型正确执行。
  2. ^ 访问权限字节中位 0–3 的解释取决于位 4。显示的位 0–3 解释与应用程序有关,包括它们的数据段和可执行代码段。在系统描述符中,位 0–3 定义了 16 种不同描述符子类型的类型。
  3. ^ 访问权限字节中位 2 的解释取决于位 3。在代码段中,位 2 的清除状态意味着代码可以被具有相同权限级别的程序执行(否则代码也可以被具有更高权限级别的程序执行)。对于数据段,位 2 的清除状态意味着正常的向上扩展方向,而位 2 的设置状态意味着相反的向下扩展方向,如堆栈段中所使用的那样。
  4. ^ 字节 06h 中的位 4 可供程序员调节。在内存页面描述符中,此位用作重新定义禁止标记,例如,用于将 I/O 地址空间映射到内存。
  5. ^ a b c d 代码段描述符中字节 06h 的大小位 6 定义地址和操作数的大小。在系统段中,字节 06h 的位 4–6 必须被清除。

A.12-3 XMS 驱动程序的选定子函数

[编辑 | 编辑源代码]

XMS 子函数由扩展内存驱动程序 HIMEM.SYS (5.04-01) 执行。在使用这些子函数之前,需要执行两个预操作。首先,使用 INT 2F\AX=4300h 函数 (8.03-22) 检查 HIMEM.SYS 驱动程序是否已安装。第二个操作是使用 INT 2F\AX=4310h 函数 (8.03-23) 找出 XMS 驱动程序的入口点的地址。返回的双字地址应为 CALL FAR 命令 (7.03-08) 指定。在调用时,要执行的子函数由 AX 寄存器中的值定义,如以下表格的第一列所示。DX 寄存器的作用显示在第二列中,返回的 AX 内容显示在第四列中。如果 AX 返回状态,AX=0001h 表示成功,AX=0000h 表示失败。在失败的情况下,几乎所有子函数(除了 AH=00h)都会在 BL 寄存器中返回错误代码 (A.06-1)。查询子函数 AH=08h 和 AH=88h 在任何情况下都会在 BL 寄存器中返回错误代码。

AH DX 子函数 返回的 AX 注释
00h   报告 XMS 版本 XMS 版本 [注释 1]
05h   打开 A20 线门 状态
06h   关闭 A20 线门 状态
08h   报告空闲 XMS 内存 最大块 [注 2]
09h 大小 分配 XMS 内存块 状态 [注 3]
0Ah 句柄 释放 XMS 内存块 状态
0Bh   在 XMS 内存中复制 状态 A.12-4
0Ch 句柄 锁定 XMS 内存块 状态 [注释 4]
0Dh 句柄 解锁 XMS 内存块 状态
0Eh 句柄 获取 XMS 句柄信息 状态 [注释 5]
0Fh 句柄 调整 XMS 内存块大小 状态 [注意 6]
10h 大小 分配 UMB 内存块 状态 [注释 7][注释 8]
11h 释放 UMB 内存块 状态 [注释 7]
12h 调整 UMB 内存块大小 状态 [注释 7][注释 8]
88h   报告空闲 XMS 内存 最大块 [注释 2][注释 9]
89h 大小 分配 XMS 内存块 状态 [注释 3][注释 9]
8Eh 句柄 获取 XMS 句柄信息 状态 [注释 5][注释 9]
8Fh 句柄 调整 XMS 内存块大小 状态 [注释 6][注释 9]
注释
  1. ^ 此子函数返回 DX 寄存器中的 HMA 区域状态:DX=0001h 表示 HMA 区域正在使用,DX=0000h 表示 HMA 区域未被使用。
  2. ^ 调用子函数 08h 时,BL=00h。返回时,DX 寄存器中报告空闲 XMS 内存的大小(以千字节为单位),AX 寄存器中报告最大可用 XMS 内存块的大小。88h 子函数执行相同操作,但在 32 位寄存器 EDX 和 EAX 中返回类似的结果。此外,子函数 88h 在 ECX 寄存器中返回与 XMS 内存的最远可用字节对应的最大物理地址。
  3. ^ 09h 和 89h 子函数都接受以千字节为单位的 XMS 内存块的请求大小,但 09h 子函数从 DX 寄存器接受请求大小,而 89h 子函数从 32 位 EDX 寄存器接受请求大小。09h 和 89h 子函数都在 DX 寄存器中返回分配的 XMS 内存块的句柄。
  4. ^ 如果成功,寄存器 DX:BX 将返回已锁定内存块的 32 位物理地址。
  5. ^ 0Eh 子函数在 BH 寄存器中返回请求的 XMS 块的锁定计数,在 BL 寄存器中返回可用句柄的数量,在 DX 寄存器中返回由指定句柄打开的 XMS 块的大小(以千字节为单位)。8Eh 子函数执行相同操作,但在 CX 寄存器中返回可用句柄的数量,在 EDX 寄存器中返回 XMS 块的大小。
  6. ^ a b 调整大小子函数 0Fh 从 BX 寄存器接受请求的内存块的新大小(以千字节为单位)。8Fh 子函数执行相同操作,但从 EBX 寄存器接受新大小。请求的内存块不能锁定。
  7. ^ 对于 CPU 型号 80386 及更高版本,10h-12h 子函数通常通过 CPU 的 TLB 缓冲区中的地址转换来实现。因此,这些子函数的执行被委托给 EMM386.EXE 驱动程序 (5.04-02),该驱动程序安排地址转换并拦截对 HIMEM.SYS 驱动程序的直接调用地址。但是,子函数 10h-12h 不一定需要将 CPU 切换到保护模式,并且可以通过 UMBPCI.SYS 驱动程序 (5.04-04) 在实模式下实现。
  8. ^ 10h 和 12h 子函数都以 16 字节单位(段落)操作 UMB 块大小规范。调整大小子函数 12h 从 BX 寄存器接受请求的新大小。分配子函数 10h 在成功终止的情况下,在 BX 寄存器中返回 UMB 块的段地址,在 DX 寄存器中返回 UMB 块的实际大小。如果失败,用 AX=0000h 值标记,则 10h 和 12h 子函数都在 DX 寄存器中返回最大可用 UMB 块的大小。
  9. ^ 与 0xh 子函数不同,8xh 子函数不能由过时的 16 位处理器实现,并且需要 HIMEM.SYS 驱动程序的版本不低于 3.07。

A.12-4 XMS 复制请求的格式

[编辑 | 编辑源代码]

XMS 驱动程序 HIMEM.SYS (5.04-01) 的子函数 AH = 0Bh (A.12-3) 从 DS:SI 寄存器接受指向此请求数据块的指针。子函数 AH = 0Bh 将一组字节从通过源句柄寻址的一个 XMS 块复制到通过目标句柄寻址的另一个 XMS 块。

偏移量 大小 描述
00h 4 要复制的字节数(必须为偶数)
04h 2 源句柄
06h 4 源块中的偏移量
0Ah 2 目标句柄
0Ch 4 目标块中的偏移量

注释 1:如果源和目标重叠,则仅保证向前复制(源基址小于目标基址)正常工作。

注释 2:如果请求中的任一句柄为 0000h,则相应的偏移量双字被解释为直接可寻址常规内存中的普通地址(段:偏移量)。

A.12-5 EMS 复制描述符的格式

[编辑 | 编辑源代码]

EMS 复制描述符指定复制和交换函数 INT 67\AX=5700h-5701h (8.03-69) 的源和目标,由 EMM386.EXE 驱动程序 (5.04-02) 执行。源和目标都可以属于 EMS 内存页或常规内存。在后一种情况下,应写入 0000h 值而不是相应的句柄号,并且应使用段地址而不是 EMS 逻辑页号来指定位置。

偏移量 大小 描述
00h 4 要复制/交换的数据块的长度(以字节为单位)
04h 1 = 00h:源块在常规内存中
    = 01h:源块在 EMS 内存页中
05h 2 源句柄(如果源在常规内存中,则为 0000h)
07h 2 源在页或常规内存段中的偏移量
09h 2 常规内存中的源逻辑页或段
0Bh 1 = 00h:目标块在常规内存中
    = 01h:目标块在 EMS 内存页中
0Ch 2 目标句柄(如果目标在常规内存中,则为 0000h)
0Eh 2 目标在页或常规内存段中的偏移量
10h 2 常规内存中的目标逻辑页或段

注释 1:对于移动操作,源和目标可以重叠,但只有在一个方向的复制才能提供正确的结果。

A.12-6 EMS 内存内部跳转的数据块

[编辑 | 编辑源代码]

所示数据块指定了由 EMM386.EXE 驱动程序 (5.04-02) 的 INT 67\AH=56h 函数 (8.03-68) 执行的 EMS 内存中子例程调用的参数。由 INT 67\AH=55h 函数 (8.03-68) 执行的 EMS 内存内部的远跳转操作使用所示数据块的一部分,直至偏移量 09h。

偏移量 大小 描述
00h 4 目标地址(段:偏移量)
04h 1 新页映射列表的长度
05h 4 指向新页映射列表的指针
09h 1 当前页映射列表的长度
0Ah 4 指向当前页映射列表的指针
0Eh 8 (保留用于 EMM386.EXE 驱动程序的数据)

注释 1:页映射列表的内部结构在文章 8.03-66 的注释 3 中进行了描述。关于要替换的当前页映射列表的数据对于在子例程执行终止时返回到当前程序执行是必需的。

A.12-7 内存控制描述符

[编辑 | 编辑源代码]

计算机的内存分配是操作系统特权。DOS 分配的每个内存块都以 16 个字节长的内存控制描述符为前缀。这些描述符也被称为 MCB(内存控制块)。MCB 很容易找到:MCB 描述符的段地址始终比与该 MCB 描述符相关联的分配内存块的段地址少一个单位。

DOS 通过 MCB 描述符链跟踪所有可用内存。[注释 3] 分配内存区域之外的空闲内存空间被 DOS 视为一个单独的内存块:它也必须以 MCB 描述符为前缀。与空闲内存空间相关联的 MCB 描述符的一个显著特征是代码 0000h,而不是所有者程序的段地址。DOS 从可跟踪的 MCB 描述符链中获取有关可用空闲内存和特定空闲内存区域排列的所有数据。

MCB 描述符中的数据结构如下表所示。

偏移量 大小 描述 注释
00h 1 = 4Dh (= M) – 不是最后一个 MCB [注释 1]
    = 5Ah (= Z) – 链中的最后一个 MCB
01h 2 所有者程序的段地址 [注 2]
03h 2 关联内存块的大小 [注 3]
05h 3 未使用
08h 8 程序文件名 [注释 4]
注释
  1. ^ 具有主要 DOS 系统数据的内存块被划分为子块,每个子块都有自己的 MCB 描述符,但在偏移量 00h 处的字节中具有其他标识符
    42h (= B) – 具有缓冲区的子块 (4.03)
    44h (= D) – 用于 DOS 驱动程序的子块
    45h (= E) – 用于 DOS 驱动程序的数据子块
    46h (= F) – 具有 SFT 表的子块 (4.12)
    49h (= I) – 用于 IFS 数据的子块
    4Ch (= L) – 具有 CDS 表的子块 (4.17)
    53h (= S) – 用于 DOS 堆栈的子块 (4.27)
    54h (= T) – 用于过渡代码的子块
    58h (= X) – 用于 FCBS 的子块 (4.10)
  2. ^ 如果关联的内存空间是空闲的,则在 MCB 描述符中,偏移量 01h 处的字被填充为零。如果关联的内存块由 DOS 分配给自己,则在偏移量 01h 处的字中写入代码 0008h,而不是所有者程序的段地址。
  3. a b 关联内存块的大小以 16 字节单位(段落)指定。每个后续 MCB 描述符的段地址比当前 MCB 描述符中偏移量 03h 处指定的值与当前 MCB 描述符的段地址之和多一个单位。根据此公式,DOS 跟踪 MCB 描述符链。跟踪从第一个 MCB 描述符开始;第一个 MCB 描述符的段地址存储在 DOS 列表列表之前的字中。该字在表 A.01-2 中标记为偏移量 −02h。
  4. ^ 程序文件的名称在那些与 PSP 内存块、驱动程序子块和 IFS 子块关联的 MCB 描述符中指定。在几个其他 MCB 描述符中的偏移量 08h 处有以下含义的签名
    SC – 关联的块包含 DOS 的可执行代码;
    SD – 关联的块包含 DOS 的数据;
    SM – 关联的块是 UMB 区域中的最后一个;
    UMB – 关联的块是 UMB 区域中的第一个。
    与其他内存块关联的 MCB 描述符中的字节 08h-0Fh 未使用,可能包含“垃圾”。
  5. ^ 带有 *.COM 后缀的程序文件没有头文件,这些头文件指定其他类型可执行文件所需的内存空间。这就是为什么对于带有 *.COM 后缀的程序,DOS 会分配整个可用内存空间,紧随之前分配的内存区域。当 DOS 没有更多可用内存空间时,计算机可能会在每次后续的内存空间请求中挂起,这可能是由意外激活的驻留程序或由外部中断触发的处理程序引起的。为了避免挂起风险,带有 *.COM 后缀的程序必须调用 INT 21\AH=4Ah 函数(8.02-52),为未使用的内存部分形成一个独立的 MCB 描述符,并将其宣布为可用。此类调用的示例显示在文章 9.06、9.10-01 和 9.10-02 中汇编文本的前 6 行。

A.13 硬盘数据结构

[编辑 | 编辑源代码]

A.13-1 BIOS 物理 HDD 参数表

[编辑 | 编辑源代码]

在 1996 年之前生产的过时计算机中的 BIOS 系统使用 CHS(柱面-磁头-扇区)参数来寻址 HDD。可用于 CHS 寻址的 HDD 存储空间限制为 528 Mb。BIOS 系统将第一个和第二个物理 HDD 的 CHS 参数存储在数据表中;这些表的地址分别写入内存单元 0000:0104h 和 0000:0118h。这两个单元都位于中断表(A.12-1)中,有时被称为 INT 41 和 INT 46。如果计算机配备了两个以上的 HDD,则获取其余 HDD 的 CHS 参数的唯一方法是调用 INT 13\AH=08h 函数(8.01-49)。

1995 年,HDD 的容量已达到 1 Gb。CHS 寻址固有的 528 Mb 限制必须克服。对于较新的 BIOS 系统,已开发出 LBA 寻址[注释 4 到 A.13-6] 和扩展的 INT 13 函数(8.01-55 - 8.01-60)。但必须保留与以前程序的兼容性。因此,在较新的 BIOS 系统中,INT 13\AH=08h 函数(8.01-49)已被“教导”产生不是实际的,而是转换后的 CHS 参数。当程序调用“旧”INT 13 函数(8.01-46 - 8.01-54)并指定转换后的 CHS 参数时,BIOS 系统会自动执行反向转换,以便可用于 CHS 寻址的 HDD 存储空间扩展到 8.4 Gb(注释 2 到 A.13-6 中有一些细节)。

存储在单元 0000:0104h 和 0000:0118h 中的指针所指向的数据块可能具有不同的数据结构:这取决于是否存在实际的或转换后的 CHS 参数。两种数据结构都显示在下表中。第一列(Std)中显示了实际的数据偏移量。第二列(Trs)中的偏移量对应于转换后的 CHS 数据,符合 Phoenix-1995 规范,适用于柱面数超过 1024 的 HDD。虽然现代 BIOS 系统支持所描述的数据块,但对于现在开发的程序来说,不建议使用这些数据块中的参数。

Std Trs 大小 描述
00h 00h 2 HDD 的柱面数 [注释 1]
02h 02h 1 HDD 的磁头数 [注释 1]
  03h 1 签名 A0h - 符合 Phoenix-1995 规范的块的独特特征。
  04h 1 每磁道扇区数 [注释 2]
05h 05h 2 应开始写入预补偿的柱面号 [注释 3]
08h 08h 1 标志 位 2 - 不重新校准;
        位 3 - 超过 8 个磁头;
        位 5 - 存在缺陷图[注释 4]
        位 6 - 禁用 ECC 读取重试;
        位 7 - 禁用访问重试。
  09h 2 磁道数(最多 65536)[注释 2]
  0Bh 1 磁头数(最多 16)[注释 2]
0Ch 0Ch 2 着陆区的柱面号[注释 3]
0Eh 0Eh 1 每磁道扇区数 [注释 1]
  0Fh 1 数据校验和
注释
  1. ^ 这些位置中的 CHS 参数适用于 INT 13 处理程序的“旧”函数(8.01-46 - 8.01-54)。但是,某些 BIOS 版本在这些位置指定了超过 1024 的柱面数,这对“旧”函数来说是不可接受的。
  2. ^ 这些位置填充了实际 HDD 参数,供不调用 INT 13 处理程序,而是直接调用 HDD 控制器端口的程序使用。这些位置不会填充在那些为 INT 13 处理程序的“旧”函数提供实际参数的数据块中。
  3. ^ 现代磁盘驱动器独立执行着陆和写入预补偿。尝试影响这些操作会被忽略。
  4. ^ 编写表面缺陷图的磁道号通常比 BIOS 表格中物理 HDD 参数偏移量 00h 中指定的柱面号大一个单位。

A.13-2 扩展的 HDD 参数表

[编辑 | 编辑源代码]

INT 13\AH=48h 函数(8.01-60)将扩展的 HDD 参数表写入准备好的缓冲区。

偏移量 大小 描述
00h 2 调用时:准备好的缓冲区的长度(8.01-60)
    返回时:返回数据的实际长度
02h 2 标志 位 0 : 透明处理 DMA 边界错误
      位 1 : CHS 数据(A.13-1)有效
      位 2 : 这是可移动驱动器,位 4-6 有效
      位 3 : 支持带验证的写入
      位 4 : 驱动器提供更改线支持
      位 5 : 驱动器提供锁定和解锁
      位 6 : 介质不存在,报告默认 CHS 数据
04h 4 驱动器上的物理柱面数 [注释 1]
08h 4 驱动器上的物理磁头数 [注释 1]
0Ch 4 每磁道物理扇区数(从 1 开始计数)
10h 8 扇区总数(最后一个扇区的编号加 1)
18h 2 每扇区字节数
1Ah 4 指向辅助 DPTE 表的指针 [注释 2]
1Eh 2 = BEDDh: 确认路径数据存在的签名
20h 1 = 2Ch: 路径数据的大小,包括签名
24h 4 总线类型(ISA 或 PCI)后跟一个空格(20h)
28h 8 接口类型 [注释 3]
30h 8 接口路径字段 [注释 4]
38h 16 设备路径字段 [注释 5]
49h 1 偏移量 1Eh-48h 内字节的补码校验和
注释
  1. ^ 有效的磁道、柱面和磁头编号从零开始计数,因此最后一个有效编号比此字段中指定的数值小一个单位。此字段中的值是实际值。因此,此值不应在调用“旧”INT 13 函数时指定:这些函数需要 INT 13\AH=08h 函数(8.01-49)返回的转换参数。
  2. ^ 低于 2.x 版本的 BIOS INT 13 扩展不返回 DPTE 表,而是将 DPTE 指针字段填充为 FFFFh:FFFFh 值。DPTE 表的结构如附录 A.13-3 中所示。DPTE 表显示在临时缓冲区中;在后续调用 BIOS 函数后,其内容不会被保留。
  3. ^ 接口类型字段可以填充以下字:1394、ATA、ATAPI、SCSI、USB。这些字后跟空格,直到名义字段长度为 8 字节。
  4. ^ 对于 ISA 总线,路径字段包含一个 2 字节的基本 I/O 端口地址,偏移量 32h-37h 处的字节为零。对于 PCI 总线,偏移量 30h 处的字节表示总线号;偏移量 31h 处的字节表示插槽号;偏移量 32h 处的字节表示功能号;偏移量 33h 处的字节表示控制器号;偏移量 34h-37h 处的字节为零。
  5. ^ 对于 1394(Firewire)接口,从偏移量 38h 开始指定一个 8 字节的扩展唯一标识符(EUI-64)。对于 ATA(IDE)接口,偏移量 38h 处的 00h 值表示主设备,偏移量 38h 处的 01h 值表示从设备。偏移量 38h 处的字节对 ATAPI 接口具有相同的含义,但偏移量 39h 处的字节表示逻辑单元号(LUN)。对于 SCSI 接口,从偏移量 38h 开始指定一个 2 字节的设备标识符(SCSI ID),从偏移量 3Ah 开始指定一个 8 字节的逻辑单元号(LUN)。对于 USB 接口,从偏移量 38h 开始写入一个 8 字节的序列号。未提及的偏移量 3Ah-48h 处的字节保留,必须清除。

A.13-3 辅助设备参数表 DPTE

[编辑 | 编辑源代码]

BIOS INT 13 版本 2.0 及更高版本使用辅助设备参数表 DPTE 来补充扩展的 HDD 参数表(A.13-2)。INT 13\AH=48h 函数(8.01-60)在扩展的 HDD 参数表(A.13-2)中的偏移量 1Ah 处返回指向 DPTE 表的指针。DPTE 地址指向一个临时缓冲区,在后续调用 BIOS 函数后,该缓冲区不会保留其内容。DPTE 表中的数据专供那些打算直接调用 HDD 控制器端口的程序使用。DPTE 数据结构如以下表格所示。

偏移量 大小 描述
00h 2 设备的物理 I/O 端口基地址
02h 2 磁盘驱动器控制寄存器端口地址
04h 1 标志 位 0-3 被清零,位 5 和 7 被置位。
      位 4:如果为主设备则被清零,如果为从设备则被置位。
      位 6:如果启用了 LBA寻址则被置位。
06h 1 位 0-3:IRQ 编号,位 4-7 被清零。
07h 1 多块传输的块(扇区)计数。
08h 1 位 0-3:DMA 通道号,位 4-7:根据 ATA-2 规范的 DMA 类型。
09h 1 位 0-3:PIO 类型,如果在偏移量 0Ah 的字中位 0 被置位。
0Ah 2 标志 位 0:快速 PIO 启用,字节 09h 有效。
      位 1:快速 DMA 访问启用。
      位 2:多扇区传输启用。
      位 3:CHS 参数转换启用。
      位 4:LBA 转换启用。
      位 5:驱动器使用可移动介质。
      位 6:ATAPI 接口设备(可能是 CD-ROM)。
      位 7:32 位传输模式启用。
      位 8:ATAPI 信号准备好进行数据包传输。
      位 9-10:CHS 参数转换类型。
= 00 – 位移转换。
= 01 – LBA 辅助转换。
= 10, 11 – 专有转换。
      位 11:Ultra DMA 访问启用。
0Eh 1 INT 13 扩展版本号。
0Fh 1 字节 00h-0Eh 的校验和。

A.13-4 磁盘地址数据包

[编辑 | 编辑源代码]

这种形式的数据包由扩展读取函数 INT 13\AH=42h(8.01-56)和扩展写入函数 INT 13\AH=43h(8.01-57)使用。在应用这些函数之前,应通过调用 INT 13\AH=41h(8.01-55)检查 BIOS 是否支持这些函数。

偏移量 大小 描述
00h 1 地址数据包的大小 [注释 1]
02h 1 要传输的数据块数量(最多 7Fh)[注释 21]
04h 4 指向数据传输缓冲区的指针[注释 3]
08h 8 第一个数据块的 LBA 绝对编号[注释 4]
10h 8 指向数据传输缓冲区的 64 位指针 [注释 3]
18h 8 要传输的数据块数量 [注释 21]
注释
  1. ^ 如果支持扩展磁盘地址数据包,则大小为 20h,否则大小为 10h。由 INT 13\AH=41h 函数(8.01-55)返回的 CX 寄存器中的位 3 状态表示是否支持扩展磁盘地址数据包。
  2. ^ 如果支持扩展磁盘地址数据包,并且如果将 FFh 值写入偏移量 02h 的字节中,则要传输的块数将从偏移量 18h 的四字中读取。返回时,偏移量 18h 处的此数字将替换为实际传输的块数。
  3. ^ 如果支持扩展磁盘地址数据包,并且如果将 FFFF:FFFFh 值写入偏移量 04h 的双字中,则指向数据缓冲区的指针将从偏移量 10h 的四字中读取。
  4. ^ 对于不支持 LBA 寻址的磁盘驱动器,[注释 4 至 A.13-6]起始块的绝对编号将根据以下公式计算
    (C×N + H)×T + S − 1
    其中:C – 所选柱面的编号,N – 磁头数量(比最大磁头号大 1),H – 所选磁头的编号,T – 每磁道上的扇区数量,S – 磁道上所选扇区的编号。

A.13-5 HDD 的分区描述符

[编辑 | 编辑源代码]

在可引导物理 HDD 的磁头 00 柱面 00 的扇区 01h 中是主引导记录 (MBR),包含最多 446 字节的可执行代码、4 字节标识符(在偏移量 1B8h-1BBh 处)和分区表。标识符仅由 Windows-NT/2000/XP 操作系统写入,并且可能不存在。要查看 MBR 扇区,应将其复制到一个文件中,如文章 9.02-02 中所述。非文本文件可以通过 Volkov Commander 文件管理器(6.25)的查看器或调试器 DEBUG.EXE(6.05)打开。图 12 显示了从实际物理磁盘复制的 MBR 扇区的片段。

图 12

第一个片段展示了可执行代码的起始部分(专有的 OnTrack 的 MBR 版本)。第二个片段展示了该可执行代码的结束部分,并带有准备好的错误消息。第三个片段展示了分区表,定义了在特定计算机中将 HDD 的可写表面划分为分区的方式。

分区表由 4 个分区描述符组成,每个描述符 16 字节长。如果从 MBR 扇区的开头开始计算偏移量,则分区描述符的偏移量分别为 1BEh、1CEh、1DEh、1EEh。但是,图 12 中显示的 MBR 扇区副本是从偏移量 100h 开始加载的;因此,在图 12 中,分区描述符的偏移量为 2BEh、2CEh、2DEh、2EEh。MBR 扇区中的最后一个字是签名 AA55h,标记着可引导磁盘的 MBR 的结束。

四个分区描述符允许在任何物理 HDD 驱动器中创建最多四个主分区。如果分区少于 4 个,其余描述符将用零填充。在图 12 中,分区表中的第一个描述符用零填充。因此,这个特定 HDD 被划分为三个有效的为主分区。

在一个可引导的 HDD 上,一个为主分区必须被标记为活动分区(可能可引导),在第一个描述符的字节中使用 80h 标记。在图 12 中,80h 标记出现在偏移量 02CEh 处,这是第二个分区描述符的第一个字节。因此,这个特定 HDD 中的活动分区是第二个分区。

下表显示了上述以及其他字节在分区描述符中的作用。表中第一列中的偏移量是从每个分区描述符的开头开始计算的。

偏移量 大小 描述
00h 1 状态指示器(80h – 活动分区)
01h 1 分区的起始 HDD 磁头
02h 1 分区的第一个扇区 [注释 1]
03h 1 分区的第一个磁道 [注释 1]
04h 1 分区的文件系统标识符 (A.13-6)
05h 1 分区的最终 HDD 磁头
06h 1 分区的最后一个扇区 [注释 2]
07h 1 分区的最后一个磁道 [注释 2]
08h 4 在分区之前存在的扇区数量
0Ch 4 分区的长度(以扇区为单位)
注释
  1. ^ 在偏移量 02h 的字节中,位 5-0 表示分区在磁道上的第一个扇区号,但位 6 和 7 表示分区 10 位第一个磁道号的最高有效位。分区 10 位第一个磁道号的 8 个最低有效位存储在偏移量 03h 的字节中。
  2. ^ 在偏移量 06h 的字节中,位 5-0 表示分区在磁道上的最后一个扇区号,但位 6 和 7 表示分区 10 位最后一个磁道号的最高有效位。分区 10 位最后一个磁道号的 8 个最低有效位存储在偏移量 07h 的字节中。
  3. 具有 LBA 寻址的分区描述符[注释 4 至 A.13-6]可能包含无效的 CHS 参数(磁道数、磁头数和扇区数)。但是,偏移量 08h-0Fh 的字节中的数据必须有效。

A.13-6 选定的文件系统标识符

[编辑 | 编辑源代码]

在每个分区描述符(A.13-5)中,偏移量 04h 的字节是文件系统标识符。操作系统会读取文件系统标识符并“决定”它是否可以确保对该分区的访问。如果操作系统“不知道”文件系统标识符,则不会尝试访问该分区。很可能这样的分区甚至不会显示给用户。一些文件系统标识符表示隐藏分区,这些分区可以出于系统目的访问,但对用户隐藏。下表显示了对选定文件系统标识符的解释。

ID 描述
00h 磁盘的空闲空间
01h 用于大小不超过 16 Mb 的卷的 FAT-12 文件系统
04h 过时的 FAT-16(最多 32 Mb),没有簇结构
05h 具有 CHS 寻址的扩展分区 [注释 1][注释 2]
06h 具有 CHS 寻址的 FAT-16(最多 2 Gb) [注释 2]
07h NTFS 文件系统 [注释 3]
0Bh 具有 CHS 寻址的 FAT-32 [注释 2]
0Ch 具有 LBA 寻址的 FAT-32 [注释 4]
0Eh 具有 LBA 寻址的 FAT-16(最多 2 Gb) [注释 4]
0Fh 具有 LBA 寻址的扩展分区 [注释 1][注释 4]
11h 隐藏的 FAT-12 分区(用于 OS/2 引导管理器)
14h 隐藏的 FAT-16 分区(用于 OS/2 引导管理器)
1Bh 具有 CHS 寻址的隐藏的 FAT-32 [注释 2]
1Ch 具有 LBA 寻址的隐藏的 FAT-32 [注释 4]
3Ch PowerQuest 的 Partition Magic 恢复分区
42h Windows Vista 操作系统的动态分区
43h PTS DOS 引导管理器的(BootWizard 的)分区
4Dh-4Fh QNX 操作系统分区
54h OnTrack Disk Manager 的 DDO(动态驱动器覆盖)
64h-65h Novell Netware 操作系统分区
82h Linux 操作系统的交换分区
83h Linux 操作系统的 Ext2fs 文件系统
84h 用于电源状态恢复的分区
85h Linux 操作系统的扩展分区 [注释 1]
A0h 用于便携式 PC 状态恢复的分区
A5h FreeBSD 操作系统分区
A6h OpenBSD 操作系统分区
A8h MacOS 的 UFS 文件系统
A9h Net BSD 操作系统分区
ABh MacOS 的可引导分区
BEh Solaris 操作系统的可引导分区
D8h, DBh CP/M 操作系统分区
EBh BeOS 的 BFS1 文件系统
EEh 64 位 Windows 操作系统版本的 GPT 分区 [注释 5]
FDh Linux 操作系统的 RAID 分区
注释
  1. ^ 扩展分区是磁盘空间的形式规范,用于放置多个非主分区(逻辑磁盘)。非主分区的描述符不是写入 MBR 中,而是写入单独的专用扇区中,通过一串引用跟踪。MS-DOS 不允许此串环路闭合,否则 MS-DOS 会在查找此环路的结束时陷入无限循环。
  2. a b CHS(Cylinder-Head-Sector,柱面-磁头-扇区)参数在分区描述符(A.13-5)中占用 3 个字节,因此 CHS 参数最多可以寻址 2^24 个扇区,每个扇区 512 字节,相当于 2^23 千字节,或者 8 GB。因此,使用 CHS 寻址的分区不能超过磁盘空间开头的 8 GB(之后应该使用 LBA 寻址)。在表 A.13-6 中,仅标记有 CHS 的标识符用作 CHS 寻址的区分特征。
  3. ^ Microsoft 将 07h 文件系统标识符解释为可安装文件系统 (IFS),即对用户进行转换呈现的文件系统。但实际上,除了 NTFS 外,只有很少使用的 IBM 的 HPFS 文件系统使用 07h 标识符。
  4. ^ a b c d e f 线性块寻址 (LBA) 基于从磁盘空间开头算起的扇区计数,根据分区描述符(A.13-5)中字节 08h-0Fh 中的数据。LBA 可以克服 CHS 寻址固有的 8 GB 限制。LBA 需要磁盘驱动器和 BIOS 系统都支持 INT 13 处理程序的扩展功能(8.01-55)。所有现代计算机都提供此类支持。
  5. ^ 关于 GPT (= GUID 分区表) 分区的数据构成扩展 MBR,它占据的不是单个扇区,而是磁盘第一个磁道的大部分。只有 64 位版本的 Windows Server 2003、Windows XP 和 Windows Vista 操作系统才支持 GPT 分区。
  6. 据了解,分区标识符 21、23、26、31、33、34、36、71、73、74、76、86、A1、A3、A4、A6、B1、B3、B4、B6、E5、E6、F3、F6 是保留的,尚未使用。

A.13-7 磁盘空闲空间表

[edit | edit source]

此表格包含有关逻辑磁盘空闲空间的数据,由 INT 21\AX=7303h 函数(8.02-80)返回,该函数可应用于使用 FAT-12、FAT-16 和 FAT-32 文件系统格式化的逻辑磁盘。

偏移量 大小 描述
00h 2 此表格的大小(以字节为单位)
02h 2 在调用时必须为 0000h
08h 4 每个扇区的字节数
0Ch 4 空闲簇的数量
10h 4 逻辑磁盘中簇的总数
14h 4 逻辑磁盘中空闲物理扇区的数量
18h 4 逻辑磁盘中物理扇区的总数
1Ch 4 可用分配单元的数量
20h 4 逻辑磁盘中分配单元的总数

A.14 I/O 端口

[edit | edit source]

A.14-1 选择的端口地址

[edit | edit source]

端口代表计算机的硬件,因此应通过 BIOS 函数(适用于特定计算机的主板)或扩展板的设备驱动程序进行寻址。尽管有一些例外,但不建议应用程序直接访问端口。但是,了解端口地址至少有利于避免与扩展板的地址冲突。

下表显示了 AT 兼容计算机中通用端口地址分配的相对稳定特性。当然,您特定计算机的端口地址分配可能与下表所示的略有不同。

地址范围 目标设备
0000h–001Fh 第一个直接内存访问控制器 (DMA1)
0020h–0021h 第一个中断控制器 (IRQ 1 – IRQ 7, 8.01-09)
0022h–0023h 动态 RAM 控制器
0060h–0064h 键盘控制器 (A.11-3)
0070h CMOS RAM 请求接收端口 [注释 1]
0071h CMOS RAM 数据 I/O 端口 [注释 1]
0080h 制造诊断端口
00A0h–00A1h 第二个中断控制器 (IRQ 8 – IRQ 15, 8.03-75)
00B2h–00B3h 高级电源管理端口
00C0h–00DFh 第二个直接内存访问控制器 (DMA2)
00F0h–00FFh 算术协处理器
0168h–016Fh IFS 设备或扩展板
0170h–0177h 第二个 IDE 硬盘控制器(默认 IRQ 15)
01E8h–01Efh PS/2 鼠标或其他设备(IRQ 12)
01F0h–01F7h 第一个 IDE 硬盘控制器(默认 IRQ 14)
01F8h A20 线路门控控制
0200h–020Fh 游戏端口(操纵杆)
0279h 即插即用配置寄存器端口
02E8h–02EFh 串行端口 COM4
02F8h–02FFh 串行端口 COM2(默认 IRQ 3)
0300h–031Fh 与 NE2000 兼容的以太网适配器
0330h–0331h 乐器的 MIDI 接口
0378h–037Ah 并行端口 LPT1(默认 IRQ 7)
03C0h–03CFh 与 EGA 兼容的视频适配器的端口 [注释 2]
03C4h EGA 序列选择器端口 [注释 3]
03C5h EGA 序列数据端口 [注释 3]
03CEh 图形寄存器选择器端口 [注释 4]
03CFh 图形寄存器数据端口 [注释 4]
03DAh CGA/EGA/VGA 视频适配器状态端口 [注释 5]
03E0h–03E7h PCMCIA i82365 控制器的端口
03E8h–03EFh 串行端口 COM3
03F0h–03F7h 软盘控制器(默认 IRQ 6)
03F8h–03FFh 串行端口 COM1(默认 IRQ 4)
0A79h 即插即用系统数据端口
0CF8h–0CFFh PCI 总线配置端口
注释
  1. ^ a b c d CMOS RAM 中的一些数据可以通过 BIOS 设置程序(1.01)访问。此外,一些硬件数据和内存数据由 INT 11(8.01-42)和 INT 12(8.01-43)处理程序读取。可能需要直接访问 CMOS RAM 来屏蔽 NMI(8.01-03 的注释 1),以获取有关软盘驱动器的信息(A.08-03 中的偏移量 10h),以及定义 CPU 在重置后的操作,这取决于 CMOS RAM 中偏移量 0Fh 处的字节。 [注释 4 至 A.12-1] 为了访问 CMOS RAM 中的数据,应通过 OUT 命令(7.03-66)将请求的字节偏移量(最多 7Fh)发送到端口 70h;然后可以通过端口 71h,通过 IN 命令(7.03-26)读取请求的字节值,或通过 OUT 命令进行修改。
  2. ^ 由于使用 INT 10\AH=0Ch 函数(8.01-19)绘制图形速度很慢,因此操作系统直接访问视频内存和与 EGA 兼容的视频适配器的端口。因此,即使 EGA 适配器本身早已不再使用,EGA 端口地址仍被保留为标准。
  3. ^ 端口 03C5h 将通过 OUT 命令(7.03-66)发送的字节传输到视频适配器中的内部寄存器,该寄存器事先通过端口 03C4h 定义。如果事先将字节 AL = 02h 发送到端口 03C4h,则发送到端口 03C5h 的下一个字节将被接受为颜色掩码(其正常值为 0Fh)。
  4. ^ 端口 03CFh 将通过 OUT 命令(7.03-66)发送的字节传输到视频适配器中的内部寄存器,该寄存器事先通过端口 03CEh 定义。如果事先将字节 AL = 08h 发送到端口 03CEh,则发送到端口 03CFh 的下一个字节将被接受为 8 个连续像素的位掩码。如果事先将字节 AL = 05h 发送到端口 03CEh,则发送到端口 03CFh 的下一个字节将指定写入视频内存的模式(00h-02h)(8.01-39 的注释 3)。
  5. ^ 端口 03DAh 仅用于数据读取。从端口 03DAh 读取的字节中的位 3 在场回溯间隔内保持设置为 1,在这些间隔之外保持设置为 0。因此,可以使用 IN 命令(7.03-26)注册场回溯间隔,以避免图像中断,如果在回溯间隔之外更改显示的图像,则图像中断会很明显。

A.14-2 串行端口的状态

[edit | edit source]

此表介绍了 INT 14\AH=00h – INT 14\AH=03h 函数(8.01-65 – 8.01-68)在 AH 寄存器中返回的状态字节中的位字段的解释。

描述
0 接收数据已准备好
1 溢出错误
2 奇偶校验错误
3 帧错误
4 检测到中断
5 发送保持寄存器为空
6 发送移位寄存器为空
7 超时,无响应

A.14-3 连接到并行端口的打印机状态

[edit | edit source]

此表介绍了 INT 17\AH=00h – INT 17\AH=02h 函数(8.01-86 – 8.01-88)在 AH 寄存器中返回的状态字节中的位字段的解释。

描述
0 超时,无响应
1 仅 EPP BIOS:请求的端口不受支持
2 未使用
3 I/O 错误
4 端口繁忙
5 打印机缺纸
6 确认
7 打印机已准备好(不繁忙)

注释 1:使用状态字节 AH = 03h 返回的 CF 标志的设置状态表示存在 EPP BIOS,但它不支持请求的端口。

注释 2:状态字节 AH = 00h 表示 EPP 数据在寄存器中返回(A.14-4)。

A.14-4 EPP BIOS 的选择功能

[edit | edit source]

EPP 是 BIOS 的补充,根据 IEEE 1284 规范,通过 LPT 端口实现增强的​​数据传输模式。如果您的计算机中存在 EPP BIOS,则可以通过 INT 17\AX=0200h 函数(8.01-88)进行证明,该函数还会报告 LPT 端口基地址、EPP BIOS 版本和其入口点的地址。后者用作 CALL FAR 命令(7.03-08)的目标地址;以这种方式调用时,EPP BIOS 会执行操作,该操作由此时 AH 寄存器中的值指定。对于最新的 EPP BIOS 第 7 版,特定 LPT 端口的选择由 DX 寄存器中的基地址定义;早期的 EPP BIOS 版本通过 DL 寄存器中 00h–03h 的端口号来定义 LPT 端口。除此之外,一些 EPP BIOS 函数需要其他数据,这些数据显示在下表第二列或注释中,注释号显示在第五列。除非另有说明,否则几乎所有 EPP BIOS 函数都会在 AH 寄存器中返回状态字节(A.14-7),用设置的 CF 标志状态标记失败,并且不会保留 BX 寄存器的内容。

AH 调用时 EPP BIOS 函数 返回时 注释
00h   报告配置 AL = IRQ A.14-5
01h A.14-6 设置传输模式 AX 改变
02h   报告传输模式 AH 改变 A.14-6
03h AL=00h 启用 LPT 中断
03h AL=01h 禁用 LPT 中断
04h   重置 EPP AL 改变
05h AL=地址 地址写入 I/O 周期 AL 改变
06h   地址读取 I/O 周期 AL=地址
07h AL=字节 发送一个字节
08h   发送数据块   [注释 1]
09h   接收一个字节 AL=字节
0Ah   接收数据块   [注 2]
0Bh AL=地址 地址字节读取 AL=字节
0Ch AL=地址 地址字节发送   [注 3]
0Dh AL=地址 地址块读取   [注 2]
0Eh AL=地址 地址块发送   [注释 1]
0Fh AL=端口 锁定 LPT 端口   [注释 4]
10h AL=端口 解锁 LPT 端口   [注释 4]
11h CH=00h 禁用设备中断   [注释 5]
11h CH=01h 启用设备中断   [注释 5]
12h AL=00h 实时设备是否存在? 如果存在,则 AL=01h
12h AL=01h 添加实时设备
12h AL=02h 删除实时设备
40h   查询多路复用器   [注释 6][注释 7]
41h AL=端口 查询多路复用器端口   [注释 6][注释 8]
50h AL=端口 查询菊花链   [注释 6][注释 9]
51h AL=端口 重新分配链号   [注意 6]
注释
  1. ^ 调用时,必须在 DS:SI 寄存器中指定指向数据块的指针,在 CX 寄存器中指定数据块的长度(以字节为单位)。EPP BIOS 的早期版本(第 7 版之前)从 ES:DI 寄存器接收指向数据块的指针。函数在 CX 寄存器中返回未发送的字节数。
  2. ^ 调用时,必须在 ES:DI 寄存器中指定指向数据缓冲区的指针,在 CX 寄存器中指定此缓冲区的长度。成功终止后,函数将返回填充的缓冲区,并在 CX 寄存器中返回未填充的缓冲区中的字节数。
  3. ^ 调用时,要发送的数据字节必须在 CL 寄存器中指定。EPP BIOS 的早期版本(第 7 版之前)从 DH 寄存器接受数据字节。
  4. ^ 如果外部设备通过多路复用器连接,则应在 AL 寄存器中字节的位 3–0 中指定多路复用器端口号 (01h–08h)。如果外部设备以菊花链方式连接,则应在 AL 寄存器中字节的位 7–4 中指定菊花链端口号 (10h–80h)。
  5. ^ 多路复用器端口号 (01h–08h) 应在 AL 寄存器中指定。如果未使用多路复用器,则 AL 寄存器必须清零。对于中断启用功能 (CH = 01h),应在 ES:DI 寄存器中指定指向中断事件处理程序的指针。
  6. ^ 此功能在 EPP BIOS 第 7 版之前的早期版本中未实现。如果外部设备未通过多路复用器或菊花链连接到特定 LPT 端口,则不应应用此功能。所请求的 LPT 端口将不按端口号识别,而是按其 I/O 基地址识别,该地址应在 DX 寄存器中指定。
  7. ^ 此函数在 AL 寄存器中返回当前活动的多路复用器端口号,并在 CH 寄存器中返回标志字节。标志字节中位 0 的设置状态表示多路复用器端口已锁定,标志字节中位 1 的设置状态表示此多路复用器端口存在挂起的中断。
  8. ^ 此函数在 CH 寄存器中返回标志字节。此标志字节中位的设置状态具有以下含义:
    位 0 – 此端口已选择(处于活动状态)
    位 1 – 端口已锁定
    位 2 – 此端口的中断已启用
    位 3 – 此端口存在挂起的中断。
  9. ^ 此函数在 BH 寄存器中返回 EPP BIOS 版本,在 BL 寄存器中返回当前活动菊花链设备的数量,在 CH 寄存器中返回标志字节(如 注释 7 中所述),在 CL 寄存器中返回构成菊花链的设备数量(或 00h,如果不存在菊花链),在 ES:DI 寄存器中返回指向驱动程序供应商标识字符串的指针。

A.14-5 EPP BIOS 配置字节

[edit | edit source]

通过 AH 寄存器中 00h 值(A.14-4)调用时定义的“报告配置”函数在 AL 寄存器中返回 LPT 端口的 IRQ 线号,在 BH 寄存器中返回 EPP BIOS 版本,在 ES:DI 寄存器中返回指向驱动程序信息的指针,在 CX 寄存器中返回 LPT 端口的 I/O 基地址(仅适用于 EPP BIOS 1.0 – 3.0 版本),在 BL 寄存器中返回 EPP BIOS 配置字节。配置字节位域的解释如下表所示。

描述
0 存在多路复用器
1 支持双向数据传输
2 存在菊花链
3 支持 ECP 规范
4 支持 EPP 软件模拟
5 支持 EPP BIOS 函数
6 支持“快速 Centronics”数据传输
7 标准 EPP I/O 映射

A.14-6 EPP BIOS 数据传输模式代码

[edit | edit source]

通过 AH 寄存器中 02h 值(A.14-4)调用时定义的“报告传输模式”函数在 AL 寄存器中返回当前传输模式的代码。通过 AH 寄存器中 01h 值(A.14-4)调用时定义的“设置传输模式”函数能够根据 AL 寄存器中指定的模式代码更改 LPT 数据传输模式。此模式代码中位域的解释如下表所示。

描述
0 启用兼容模式
1 启用双向数据传输
2 根据 EPP 规范进行数据传输
3 根据 ECP 规范进行数据传输 [注释 1]
4 启用 EPP 软件模拟 [注释 1]
5 启用“快速 Centronics”数据传输 [注释 1]
6 = 0b (保留)
7 启用 EPP 端口中断 [注释 2]
注释
  1. ^ 由模式代码中位 3–5 的设置状态定义的模式无法由 EPP BIOS 的早期版本(第 7 版之前)实现。
  2. ^ 只要通过 AH = 11h 函数(A.11-4)启用设备中断,位 7 的设置状态就不被“设置传输模式”函数(AH = 01h)接受,但仍可能被“报告传输模式”EPP BIOS 函数(AH = 02h)报告。

A.14-7 EPP BIOS 函数的状态代码

[edit | edit source]

除 01h 和 02h(A.14-4)之外,几乎所有 EPP BIOS 函数都在 AH 寄存器中返回状态字节。EPP BIOS 状态字节代码的解释如下表所示。

代码 描述
00h 成功终止
02h 不支持所请求的命令或功能
03h 不支持所请求的并行端口
05h 当前模式不支持该请求
06h 请求的子功能无效
07h 该请求已完成或已设置
20h 不存在 LPT 多路复用器(仅限 AMI BIOS 版本)
40h 不存在 LPT 多路复用器(其他 EPP BIOS 版本)
41h 多路复用器当前已锁定
80h I/O 超时,无响应
FFh 所请求的功能无效或不受支持

A.15 CD/DVD 服务表

[edit | edit source]

A.15-1 可引导 CD/DVD 规范数据包

[edit | edit source]

BIOS 函数 INT 13\AH=4A00h 和 INT 13\AX=4C00h(8.01-61)模拟了一个逻辑磁盘,其基础是该磁盘的副本,该副本从光盘 CD/DVD 读取。模拟控制参数必须以可引导 CD/DVD 规范数据包的形式准备。此数据包的内部数据结构如下表所示。

偏移量 大小 描述
00h 1 此数据包的大小(以字节为单位)(=13h 通常)
01h 1 磁盘副本类型(与 A.15-3 中偏移量 21h 的相同)
02h 1 要模拟的驱动器号(8.01-44 的注释 1)
03h 1 要模拟的驱动器控制器号
04h 4 磁盘副本开始的 CD 逻辑块地址(与表 A.15-3 中偏移量 28h 的相同)
08h 2 0 : 模拟从属 IDE 驱动器
    7–0 : LUN 和 SCSI ID 号(对于 SCSI)
    15–8 : 总线号(对于 SCSI)
0Ah 2 已准备好的 3 kb 读取缓冲区的段地址(如果没有缓存,则为 0000h 值)
0Ch 2 加载磁盘副本引导扇区的段地址(与表 A.15-3 中偏移量 22h 的相同)
0Eh 2 磁盘副本中 512 字节虚拟扇区的数量(与表 A.15-3 中偏移量 26h 的相同)
10h 1 磁盘副本柱面数量的最低有效 8 位(如 INT 13\AH=08h 在 CH 中返回的)
11h 1 5–0 : 轨道上最后一个扇区的数量
    7–6 : 副本柱面数量的最高有效位(如 INT 13\AH=08h 在 CL 中返回的)
12h 1 模拟磁盘驱动器中的磁头数量

A.15-2 命令包格式

[edit | edit source]

此命令包指定 INT 13\AH=4Dh 函数 (8.01-63) 的参数,该函数从光学 CD/DVD 光盘读取扇区。在启动过程中,此命令包指定从 CD/DVD 光盘读取引导目录。

偏移量 大小 描述
00h 1 包大小(以字节为单位,通常为 08h)
01h 1 要读取的扇区数
02h 4 指向读取数据的缓冲区的指针
06h 2 要读取的第一个扇区的编号

A.15-3 光学 CD/DVD 光盘的引导目录

[edit | edit source]

光盘可能实现多种计算机启动方案。定义每种启动方案的初始数据必须以隐藏目录(也称为引导目录)的形式存在于可引导光盘上。可以使用 INT 13\AH=4Dh 函数 (8.01-63) 读取此目录。与普通目录一样,引导目录中的记录具有标准长度 20h 字节。引导目录的最小内容由两个必需记录组成:第一个记录称为验证条目,第二个记录是默认可引导磁盘副本的描述符。下表显示了这两个必需记录的结构。偏移量 00h-1Fh 对应于验证条目记录;偏移量 20h-3Fh 对应于默认可引导磁盘副本的描述符。

偏移量 大小 描述
00h 1 = 01h:验证条目开始的签名
01h 1 平台类型
= 00h – AT 兼容
= 01h – Power PC
= 02h – Apple Macintosh
04h 24 CD/DVD 光驱制造商(ASCII 字符串)
1Ch 2 字节 00h-1Fh 的补码校验和
1Eh 2 = AA55h:验证条目终止签名
20h 1 = 88h:可引导磁盘描述符的签名 [注释 2]
21h 1 位 3-0 
= 0000b – 无效描述符
= 0001b – 1.2 Mb 软盘副本
= 0010b – 1.44 Mb 软盘副本
= 0011b – 2.88 Mb 软盘副本
= 0100b – 硬盘副本
    位 6:– 具有 ATAPI 接口的磁盘副本
    位 7:– 具有 SCSI 接口的磁盘副本
22h 2 加载引导扇区的段地址(如果 = 0000h,则默认情况下段地址为 07C0h)
24h 1 磁盘副本文件系统标识符 (A.13-6)
26h 2 磁盘副本中 512 字节虚拟扇区的数量
28h 4 磁盘副本开始的 CD/DVD 逻辑块地址
注释
  1. 除了表 A.15-3 中所示的两个必需记录之外,CD 引导目录还可能包含其他 32 字节记录,这些记录分组在几个部分中。每个部分代表一个单独的启动选项,并且至少包含两个记录:一个标题记录和该启动选项的可引导磁盘副本描述符。标题记录以签名字节 90h 开头,除了最后一部分中的标题记录,它以签名字节 91h 开头。在每个标题记录中,偏移量 02h 处的字宣布该部分中 32 字节记录的数量。在每个部分中,启动选项的描述符之后可能是辅助记录。每个启动选项描述符中的数据结构与表 A.13-3 偏移量 20h-3Fh 中所示的默认可引导磁盘描述符相同。
  2. ^ 非可引导磁盘的描述符也是允许的,它们的独特特征是起始签名 00h。

A.15-4 由 CD/DVD 驱动程序执行的命令

[edit | edit source]

要向驱动程序发送命令,您必须获取与该驱动程序关联的句柄。第一步是通过 INT 2F\AX=1501h 函数 (8.03-14) 查找指向 CD/DVD 驱动程序头的指针,该函数由 TSR 程序 (5.08-03) MSCDEX.EXE 或 SHSUCDX.COM (5.08-04) 执行。第二步是在驱动程序头的偏移量 0Ah 处读取 8 字节的驱动程序访问通道名称(签名)。驱动程序访问通道通常以加载驱动程序的命令行中 /D: 参数后面的标识符命名(例如,CD/DVD 驱动程序的 /D:MSCD001 标识符,如文章 5.10-01-5.10-03 中所示)。接下来的第三步是使用 INT 21\AH=3Dh 函数 (8.02-33) 使用此名称获取句柄。该名称必须大写,如果它较短,则必须附加 8 个带空格的字节 (20h)。在将所需的命令发送到驱动程序之前,应将返回的句柄放在 BX 寄存器中,这可以通过 INT 21\AX=4403h 或 INT 21\AX=4402h 函数 (8.02-41) 完成。此外,这些函数还需要准备一个请求数据块。必须在 DS:DX 寄存器中指定指向请求数据块的指针,以及在 CX 寄存器中指定请求数据块的长度。不同命令的请求数据块长度在下面的表格的第二列中显示。第三列显示了 CD/DVD 驱动程序命令的代码,这些代码应在请求数据块的偏移量 00h 处指定。如果命令需要返回一些数据,驱动程序会将这些数据写入相同请求数据块的单元格中。

AX CX 代码 操作 注释
4402h 05h 00h 报告驱动程序头的地址 [注 2]
4402h 06h 01h 报告驱动器的磁头位置 [注 3]
4402h 09h 04h 报告音频控制状态 A.15-5
4402h 05h 06h 报告 CD/DVD 光驱状态 A.15-6
4402h 04h 07h 读取模式,扇区大小 [注释 4]
4402h 05h 08h 获取扇区数量 [注 2]
4402h 02h 09h 报告光盘更改状态 [注释 5]
4402h 07h 0Ah 获取音轨数量 [注意 6]
4402h 08h 0Bh 获取音轨的开始位置 [注释 7]
4403h 01h 00h 弹出托盘
4403h 02h 0100h 解锁舱门
4403h 02h 0101h 锁定舱门
4403h 01h 02h 重置驱动器 [注释 1]
4403h 09h 03h 音频控制 A.15-5
4403h 01h 05h 拉入音轨
  1. ^ 在通过 INT 21\AX=4402h 函数发送到 CD/DVD 驱动程序的任何请求之后,并且在驱动程序被激活以用于任何其他目的之前,必须通过 INT 21\AX=4403h 函数发送命令 02h 来重置它。
  2. ^ 在执行操作 00h 和 08h 后,所请求的结果将写入从偏移量 01h 开始的请求数据块中。此结果是根据所请求的操作,要么是 4 字节的数字,要么是 4 字节的地址。
  3. ^ 在请求驱动器磁头位置后,请求数据块中偏移量 01h 处的返回字节表示 CD/DVD 定址格式 
    00h – HSG 格式
    01h – 红皮书格式(帧/秒/分钟)。
    此外,请求数据块中偏移量 02h 处的双字是驱动器的磁头位置,单位取决于定址格式。
  4. ^ 在请求读取模式后,它将在请求数据块中偏移量 01h 处返回 
    00h – 带纠错读取(已处理)
    01h – 带 ECC 代码读取,但没有纠错(原始)。
    此外,返回的字在偏移量 02h 处表示扇区的大小。
  5. ^ 在请求光盘更改状态后,驱动程序在请求数据块中偏移量 01h 处返回状态字节 
    00h – 更改状态未确定,
    01h – 光盘未更改,
    FFh – 光盘已更改。
  6. ^ 在请求音轨数量后,驱动程序在偏移量 01h 处的字节中返回第一个音轨的编号,在偏移量 02h 处的字节中返回最后一个音轨的编号,并且第一个音轨的起始地址(红皮书格式)将作为双字返回到偏移量 04h 处。
  7. ^ 在调用音轨的开始位置时,必须在请求数据块中偏移量 01h 处的字节中指定所请求的音轨编号。响应此调用,驱动程序将所请求音轨的起始点的双字地址(红皮书格式)写入请求数据块的偏移量 02h 处。此外,驱动程序在偏移量 06h 处的字中返回标志,其中设置的位状态意味着以下内容 
    位 12 – 音频音轨,以预加重写入,
    位 13 – 允许数字复制,
    位 14 – 此音轨包含数据(而非音频),
    位 15 – 这是一个 4 通道音频音轨。

A.15-5 CD/DVD 音频控制

[edit | edit source]

如果在 CD/DVD 光驱状态字 (A.15-6) 中位 8 被设置,则此 CD/DVD 光驱不需要声卡来控制音频播放:此 CD/DVD 光驱本身能够控制音频播放。

为了通过 INT 21\AX=4403h 函数 (A.15-4) 将请求发送到 CD/DVD 光驱,必须在 DS:DX 寄存器中指定指向包含所请求参数的数据块的指针。下表显示了包含音频控制参数的数据块的结构,这些参数应为音频控制操作 03h 准备,以便更改音频播放。具有相同结构的数据块将由 INT 21\AX=4402h 函数响应音频控制状态请求操作 (A.15-4) 写入准备好的缓冲区中。在调用 INT 21\AX=4402h 函数时,必须在准备好的缓冲区中偏移量 00h 处的字节中填充一个字节:它必须指定音频控制状态操作的代码 04h。

偏移量 大小 描述
00h 1 函数:AX=4403h 的 03h 或 AX=4402h 的 04h
01h 1 输出通道 0 的输入通道 (0-3)
02h 1 输出通道 0 的音量
03h 1 输出通道 1 的输入通道 (0-3)
04h 1 输出通道 1 的音量
05h 1 输出通道 2 的输入通道 (0-3)
06h 1 输出通道 2 的音量
07h 1 输出通道 3 的输入通道 (0-3)
08h 1 输出通道 3 的音量

注释 1:输出通道 0 和 1 对应于左声道和右声道;输出通道 2 和 3 对应于后左声道和后右声道。通过发送其音量值为 00h 可以关闭每个通道。

注释 2:默认情况下,每个输入通道都连接到具有相同编号的输出通道,并且音量设置为最大值 FFh。

A.15-6 光盘驱动器状态字中的位域

[edit | edit source]

此表显示了状态字中位域的含义,该状态字由 INT 21\AX=4402h 函数在响应 CD/DVD 光驱状态请求 06h (A.15-4) 时在数据块中偏移量 01h 处返回。

描述
0 驱动器托盘已弹出
1 托盘盖已解锁
2 支持“原始”读取模式 [注释 1]
3 驱动器启用写入 CD/DVD 光盘
4 CD/DVD 驱动器能够播放音频/视频轨道
5 CD/DVD 驱动器支持交错 [注释 2]
7 CD/DVD 驱动器支持预取请求 [注释 3]
8 CD/DVD 驱动器支持音频声道控制
9 支持红皮书寻址(除了 HSG)
10 CD/DVD 驱动器正在播放音频
11 CD/DVD 驱动器中没有光盘
12 CD/DVD 驱动器具有独立的读写通道
  1. ^ “原始”读取模式意味着 ECC 代码与数据一起读取并发送到输出,但没有执行纠错。正常的“已处理”读取模式意味着 ECC 代码用于纠错,但不会与纠正后的数据一起发送到输出。
  2. ^ 这里的交错与视频文件相关,由交替的图像帧和音频帧组构成。
  3. ^ 预取请求会导致读取到驱动器的内存缓冲区中,这样以后就可以获取请求的数据,而无需等待访问请求的轨道。

A.16 一些相关的缩写

[编辑 | 编辑源代码]
ACPI 高级配置与电源接口规范规定以数据表的形式将主板参数呈现给操作系统,这些数据表位于专用内存区域中。
AGP 加速图形端口:用于插入视频适配器的插槽,以及视频适配器与主板交互的规范。
AH CPU 的 8 位寄存器,表示 16 位 AX 寄存器的位 15-8。
AL CPU 的 8 位寄存器,表示 16 位 AX 寄存器的位 7-0。
AMIS 备用多路复用中断规范(A.07-6)
ANSI 美国国家标准学会(美国)
API 应用程序编程接口,即 OS 为程序提供的服务。
APM 高级电源管理:计算机 BIOS 系统的扩展,提供对电源的控制(8.01-70 – 8.01-72)
ASCII 美国信息交换标准代码。
ASCIIZ 以至少一个 00h 字节结尾的 ASCII 代码字符串。
ASPI 高级 SCSI 编程接口:SCSI 接口的增强命令集(5.07-03)。如今,许多 ASPI 命令在 ATAPI(5.07-01)和 USB(5.07-05)控制器中实现。
AT 高级技术:IBM 于 1984 年生产的 PC 机型的名称。大多数现代计算机继承了 AT 机型的某些功能。
ATA AT 附加:磁盘存储设备的接口,首次在 IBM 的 PC AT 机型中实现。
ATAPI ATA 包接口:ATA 的包增强(5.07-01)。
ATX AT 扩展:自 1998 年以来实施的 PC 模块构造特性的增强规范。
AUX 保留字,用于寻址串行端口 COM1。
AVI 视频文件的扩展名,由交错的音频和视频帧组成。
AX 16 位通用寄存器,与 CPU 的算术单元相关联。在 32 位 CPU 中,AX 表示 32 位寄存器 EAX 的一部分(位 15-0)。
b 二进制:二进制数的显着标记。
BAT 批处理文件的扩展名,由 COMMAND.COM(6.04)解释。与普通命令文件不同,批处理文件由 COMMAND.COM 解释器从命令行接受,无需输入重定向。
BH CPU 的 8 位寄存器,表示 16 位 BX 寄存器的位 15-8。
BIOS 基本输入输出系统,与 PC 主板一起提供的系统。
BL CPU 的 8 位寄存器,表示 16 位 BX 寄存器的位 7-0。
BP 基址指针:16 位寄存器,用作寻址数据数组的基址。在 32 位 CPU 中,BP 表示 32 位寄存器 EBP 的位 15-0。
BPB BIOS 参数块(A.03-4)。
BSD 伯克利软件发行版,以免费软件操作系统而闻名。
BX 16 位通用寄存器,也用作寻址数据的基址。在 32 位 CPU 中,BX 表示 32 位寄存器 EBX 的位 15-0。
CD 光盘:单面 650-800 MB 光盘。
CD-ROM 只读光盘或用于此类光盘的驱动器。
CDS 当前目录结构(A.03-3)。
CF – (1) : CPU 的进位标志,用于指示进位和错误。
CF – (2) : Compact Flash - 一种可移动存储卡类型。
CGA 彩色图形适配器:IBM 的第一个彩色视频适配器型号。
CH CPU 的 8 位寄存器,表示 16 位寄存器 CX 的位 15-8。
CHS 柱面-磁头-扇区:HDD 寻址模式。[A.13-6 的注释 2]
CL CPU 的 8 位寄存器,表示 16 位寄存器 CX 的位 7-0。
CMOS 互补金属氧化物半导体:BIOS 在 CMOS 芯片上的内存块,当 PC 关闭时不会丢失存储的数据。
COM – (1) : 可执行文件的扩展名,没有头文件。
COM – (2) : 访问串行端口的保留字。
COM – (3) : 通用对象模型 - 一种编程技术。
CON 控制台,即用于输入的键盘和用于输出的显示器。
CP 代码页(有关 CP 的更多信息,请参阅文章 1.06 和 A.02-2)。
CP/M 微型计算机控制程序:DR-DOS 的原型。
CPU 中央处理器 - PC 中的主要处理器芯片。
CR 控制寄存器:32 位寄存器 CR0、CR2、CR3(A.11-4),在 80386 CPU 模型中引入。CR4 后来在奔腾 CPU 中引入。
CRC 循环冗余校验:仅用于错误检测的代码(没有纠正)
CRT 阴极射线管。
CS 代码段:16 位段寄存器,定义 CPU 执行的代码的段地址。
CSM 兼容性支持模块使用普通 BIOS 系统的功能补充 UEFI BIOS,从而能够使用 DOS 软件,启动 Windows-XP 和许多其他无法在 UEFI 下启动的操作系统。
CWR 算术协处理器的控制字寄存器。
CX 16 位通用寄存器,通常用作计数器。在 32 位 CPU 中,CX 表示 32 位寄存器 ECX 的一部分(位 15-0)。
DAC 数模转换器。
dd 月份中的两位数十进制日数。
DDO 动态驱动器叠加:OnTrack 的 BIOS 扩展,用于在过时的 PC 中访问超过 512 MB 的 HDD。
DH CPU 的 8 位寄存器,表示 16 位寄存器 DX 的位 15-8。
DI 目标索引:16 位寄存器,通常用于存储目标偏移量。在 32 位 CPU 中,DI 表示 32 位寄存器 EDI 的一部分(位 15-0)。
DL CPU 的 8 位寄存器,表示 16 位寄存器 DX 的位 7-0。
DMA 直接内存访问。
DOS 基于磁盘的操作系统。
DPB 驱动器参数块(A.03-1)。
DPMI DOS 保护模式接口:为程序设计的 API 函数,旨在以 CPU 的 V86 模式执行。DPMI 是由 Windows 操作系统的“DOS 框”实现的(有关详细信息,请参阅 8.03-21)。
DPR 算术协处理器的數據指针寄存器。
DPTE 驱动器参数表扩展(A.13-3)。
DR – (1) : Digital Research - CP/M 和 DR-DOS 的开发公司。
DR – (2) : 调试寄存器 - CPU 的寄存器 DR0-DR7(A.11-5)。
DS 数据段:16 位段寄存器,定义当前程序数据块的段地址。
DTA 数据传输区(8.02-16,A.09-1)
DVD 数字通用光盘 - 光盘,每面存储 4.7 GB 数据。
DX 16 位通用寄存器。在 32 位 CPU 中,DX 表示 32 位寄存器 EDX 的一部分(位 15-0)。
EAX 32 位 CPU 中的 32 位通用寄存器。EAX 寄存器的最低有效位(位 15-0)构成 AX 寄存器。
EBIOS BIOS 扩展,在过时的 PC 中提供 LBA 方式的磁盘访问。
EBP 32 位 CPU 中的 32 位基址寄存器。EBP 寄存器的最低有效位(位 15-0)构成 BP 寄存器。
EBX 32 位 CPU 中的 32 位通用寄存器。EBX 寄存器的最低有效位(位 15-0)构成 BX 寄存器。
ECC 纠错码。
ECP 扩展功能端口:LPT 端口的数据传输规范。
ECX 32 位 CPU 中的 32 位通用寄存器。ECX 寄存器的最低有效位(位 15-0)构成 CX 寄存器。
EDI 32 位 CPU 中的 32 位目标偏移寄存器。EDI 寄存器的最低有效位(位 15-0)构成 DI 寄存器。
EDX 32 位 CPU 中的 32 位通用寄存器。EDX 寄存器的最低有效位(位 15-0)构成 DX 寄存器。
EFI 可扩展固件接口:英特尔的 32 位 BIOS 规范,最初针对 Itanium 64 位单核 CPU(2002 年)。针对更新的 32 位多核 CPU 的 EFI 修订版被称为 UEFI(2007 年)。
EGA 增强型图形适配器:过时的 IBM 彩色视频适配器。现代视频适配器继承了 EGA 的许多重要功能。
EHCI 增强型主机控制器接口:用于 USB 总线版本 2.x 的控制器规范(有关详细信息,请参阅 5.07-05)。
EMM 扩展内存管理器:EMM386.EXE 驱动程序(5.04-02)。
EMS 扩展内存规范,由 EMM(5.04-02)实现。
EOF 文件结束:ASCII 代码中的 EOF 标记是字节 1Ah。
EPP 增强型并行端口:LPT 功能的 BIOS 扩展(A.14-4)
ES CPU 中的 16 位段寄存器,定义目标段地址。
ESI 32 位 CPU 中的 32 位源偏移寄存器。ESI 的最低有效位(位 15-0)构成 SI 寄存器。
ESP 32 位 CPU 中的 32 位堆栈指针寄存器。ESP 的最低有效位(位 15-0)构成 SP 寄存器。
EXE 可执行:具有头文件的可执行文件的扩展名。
FASM 平面汇编器:DOS、Windows、Linux 和 Unix 的现代免费软件汇编器。可以从 http://www.flatassembler.net/ 下载。
FAT 文件分配表。
FCB 文件控制块(A.09-5)。
FCBS 命令(4.10),为 FCB 预留内存。
FDD 软盘驱动器。
FS 辅助的 16 位段寄存器,从 CPU 80386 开始引入。
GDT 全局描述符表 - 一张包含 8 字节段描述符的表,在保护模式下定义主要系统段。(A.12-2)。
GDTR CPU 的系统寄存器。存储 GDT 的线性地址和大小。
GS 辅助的 16 位段寄存器,从 CPU 80386 开始引入。
GUI 图形用户界面 - 文本命令行的替代方案。
GUID 全局唯一标识符 - 32 字节长的通用标识符。
h 十六进制 - 十六进制数字的特殊标记。
HDD 硬盘驱动器。
HMA 高内存区 - 内存区域 1024–1088 kb。
HRS 隐藏、只读、系统 - 系统文件的一组属性。
HSG 高 Sierra 组规范 - ISO 9660 标准的原型。
IBM 国际商用机器公司。
ID 标识符。
IDE 集成驱动电子 - HDD 接口,等效于 ATA。
IDT 中断描述符表 - 保护模式下中断的表。它的段描述符有时也称为 IDT。
IDTR CPU 的系统寄存器。存储 IDT 的线性地址和大小。
IEEE 电气和电子工程师协会。
IFS 可安装文件系统 - 文件系统 (5.08-01),通过可安装驱动程序访问。
IML 初始机器加载系统。
INT 中断 - 事件或命令 (7.03-28),调用中断处理程序。
I/O 输入/输出,即数据传输操作。
IOCTL 输入/输出控制系统 (8.02-41)。
IP 指令指针 - 16 位寄存器,定义下一个命令的偏移量。在 32 位 CPU 中,IP 代表 32 位 EIP 寄存器的部分(位 15–0)。
IPR 算术协处理器中的指令指针寄存器。
IRQ 中断请求线。
ISA 工业标准体系结构 - 用于扩展卡的(已过时)总线。
ISO 国际标准化组织。
ISP 中断共享协议 (A.07-5)。
JFT 作业文件表 - 打开句柄的表。[Note 3 to A.07-1]
LAN 局域网。
LBA 线性块寻址 - HDD 的寻址模式。[Note 4 to A.13-6]
LCD 液晶显示器。
LFN 长文件名 (A.09-3)。
LIM Lotus-Intel-Microsoft - EMS 规范的创始人。
LPT 行式打印机 - 端口,也称为并行端口。
LUN 逻辑单元号 - 用于共享一个总线地址的设备的标识符。[Note 1 to A.03-2]
MASM 宏汇编器 - 微软的低级代码汇编器。
MBR 主引导记录 (A.13-5)。
MCB 内存控制块 - 16 字节长的描述符 (A.12-7)。
MDA 单色显示适配器,用于 IBM 的过时 PC。
mm 一年中的两位数的十进制月份数字。
MO 磁光盘或磁盘驱动器。
MS 微软拥有或开发的对象的标记。
MSWR 机器状态字寄存器 - CPU 80286 中的控制寄存器。在现代 CPU 中,MSWR 是控制寄存器 CR0 的一部分。
NTFS Windows NT/2000/XP 下 HDD 的新技术文件系统。
NUL – (1) : 通道“无处可去”,作为真实通道的替代方案。
NUL – (2) : 00h 字节值。
OEM 原始设备制造商 - 直接交付组件(作为零售销售的反义词)。
OHCI 开放主机控制器接口 - 用于 USB 总线版本 1.x (5.07-05) 的控制器规范。
OS 操作系统。
PC 个人电脑。
PCI 外设组件互连 - 用于扩展卡的总线类型。
PCMCIA PC 内存卡国际协会 - 接口标准,最初设计用于内存扩展卡 (5.07-02)。
PD 高性能磁盘 - 一种 650 Mb 的 CD-RAM 型可重写光盘,DVD-RAM 光盘的原型。
PIO 对具有 ATAPI 接口的设备进行编程 I/O 控制。
PM CPU 操作的保护模式。
POST 开机自检 - PC 开机时由 BIOS 执行。
PRN 用于地址打印机端口 LPT1 的保留字。
PSP 程序段前缀 (A.07-1)。
PS/2 个人系统/2 - IBM 在 1987 年开发的 PC 型号。
PS2 鼠标端口和连接器类型,首次在 PS/2 PC 中引入。
PTS PhysTechSoft - 俄罗斯软件供应商,以其 PTS-DOS 闻名
RAID 廉价磁盘冗余阵列 - 分布式存储技术,提高传输速度。在永久合格维护下,某些 RAID 版本也可能降低数据丢失的风险。
RAM 随机存取内存 - 普通的可写内存,作为对磁带和磁盘介质的顺序访问的替代方案。
ROM 只读存储器,即不可重写存储介质。
SCSI 小型计算机系统接口 (5.07-03)。
SFT 活动句柄关联的系统文件表 (A.01-4)
SFX 自解压压缩档案或模块。
SI 源索引 - 16 位寄存器,用于存储源地址偏移量。在 32 位 CPU 中,SI 代表 32 位 ESI 寄存器的部分(位 15–0)。
SIMD 单指令多数据 - 一类命令,对一组数据项执行相同的操作。
SP 堆栈指针 - 16 位寄存器,定义堆栈顶部的偏移量。在 32 位 CPU 中,SP 寄存器代表 32 位 ESP 寄存器的部分(位 15–0)。
SS 堆栈段 - 16 位寄存器,定义堆栈的段地址。
SSE 流式 SIMD 扩展 - 在现代 CPU 中实现的 SIMD 命令集的扩展。
STDIN 输入通道,对应于句柄 0000h,默认情况下与键盘关联作为数据源。
STDOUT 输出通道,对应于句柄 0001h,默认情况下与显示器关联作为目标设备。
STDERR 显示错误消息的通道,与句柄 0002h 关联。
SVGA VESA 建议的超级 VGA 视频模式 (A.10-1)。
SWR 算术协处理器中的状态字寄存器 (7.04-08, 7.04-64)。
TASM TurboASseMbler - Borland 公司的低级代码汇编器。
TLB 转换后备缓冲区 - CPU 中的缓存缓冲区,执行线性地址到物理地址的转换。
TSR 终止并驻留 - 驻留模块或程序 (8.02-23)
TWR 算术协处理器中的标签字寄存器。
UEFI 统一 EFI - EFI 的修订版,于 2007 年被采用用于现代 32 位多核 CPU。UEFI 规定了图形外壳、网络支持以及通过 CSM 模块保持与操作系统的兼容性。
UHCI 通用主机控制器接口 - 用于 USB 总线版本 1.x (5.07-05) 的控制器规范。
UMB 上部内存块 - 地址空间块,分配用于在 640–1024 kb 区域内加载驱动程序。
USB 通用串行总线 (5.07-05)。
V86 虚拟 8086 模式 - 现代 CPU 对过时 CPU 8086 的仿真,在保护模式下运行。V86 模式允许在最低(第三)特权级别执行 DOS 程序。
VBE 视频 BIOS 扩展,由 VESA 开发 (8.01-35),用于实现 SVGA 视频模式。
VC Volkov Commander 外壳 (6.25)。
VCPI 虚拟控制程序接口 - 允许从一个控制程序到另一个控制程序的控制转移的交互协议 (5.04-02)。
VESA 视频电子标准协会。
VGA 视频图形阵列 - 用于 IBM PS/2 计算机的视频适配器。
XMS 由 Himem.sys (5.04-01) 实现的扩展内存规范
YIQ 像素表示模型,在亮度和两个色度轴上,对应于最高和最低视觉色彩分辨率。
YUV 像素表示模型,在亮度和两个色度轴上,符合 CIE(国际照明委员会)的规范。
yy 年份(在 MS-DOS 中,年份由一个四位数表示)。
ZIP – (1) : 由 PKZIP 实用程序压缩的归档文件的扩展名。
ZIP – (2) : 由 Iomega 公司生产的可移动磁盘驱动器的商标。
ZF CPU 的零标志,用于指示相等或零结果。
华夏公益教科书