发信人: micheal (平凡的世界), 信区: cnlinux
标  题: HardDisk,Partition,Boot,OSLoader专题(4)
发信站: 哈工大紫丁香 (Wed Jan 12 10:00:54 2000), 转信

发信人: suzhe (I Love Linux), 信区: Linux       
发信站: BBS 水木清华站 (Tue Nov 23 17:35:15 1999)

三. 接口规范

1. 寄存器约定
    在扩展 Int13H 调用中一般使用如下寄存器约定:

    ds:di ==> 磁盘地址数据包( disk address packet )
    dl    ==> 驱动器号
    ah    ==> 功能代码 / 返回码

    在基本 Int13H 调用中, 0 - 0x7F 之间的驱动器号代表可移动驱动器
0x80 - 0xFF 之间的驱动器号代表固定驱动器. 但在扩展 Int13H 调用中
0x80 - 0xFF 之间还包括一些新出现的可移动驱动器, 比如活动硬盘等.
这些驱动器支持先进的锁定,解锁等功能.
    ah 返回的错误码除了标准 Int13H 调用规定的基本错误码以外,又增加
了以下错误码:

   B0h   驱动器中的介质未被锁定

   B1h   驱动器中的介质已经锁定

   B2h   介质是可移动的

   B3h   介质正在被使用

   B4h   锁定记数溢出

   B5h   合法的弹出请求失败

2. API 子集介绍
   1.x 版的扩展 Int13H 调用中规定了两个主要的 API 子集.

   第一个子集提供了访问大硬盘所必须的功能, 包括 检查扩展 In13H
是否存在( 41h ), 扩展读( 42h ), 扩展写( 43h ), 校验扇区( 44h ),
扩展定位( 47h ) 和 取得驱动器参数( 48h ).
   第二个子集提供了对软件控制驱动器锁定和弹出的支持, 包括 检查扩展
Int13H 是否存在( 41h ), 锁定/解锁驱动器( 45h ), 弹出驱动器( 46h ),
取得驱动器参数( 48h ), 取得扩展驱动器改变状态( 49h ), int 15h.
   如果使用了调用规范中不支持的功能, BIOS 将返回错误码 ah = 01h,
CF = 1.

3. API 详解

1) 检验扩展功能是否存在
入口:
    AH = 41h
    BX = 55AAh
    DL = 驱动器号

返回:
    CF = 0
       AH = 扩展功能的主版本号
       AL = 内部使用
       BX = AA55h
       CX = API 子集支持位图
    CF = 1
       AH = 错误码 01h, 无效命令

    这个调用检验对特定的驱动器是否存在扩展功能. 如果进位标志置 1
则此驱动器不支持扩展功能. 如果进位标志为 0, 同时 BX = AA55h, 则
存在扩展功能. 此时 CX 的 0 位表示是否支持第一个子集, 1位表示是否
支持第二个子集.
    对于 1.x 版的扩展 Int13H 来说, 主版本号 AH = 1. AL 是副版本号,
但这仅限于 BIOS 内部使用, 任何软件不得检查 AL 的值.

2) 扩展读
入口:
    AH = 42h
    DL = 驱动器号
    DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:
    CF = 0, AH = 0 成功
    CF = 1, AH = 错误码

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

3) 扩展写
入口:
    AH = 43h
    AL
       0 位 = 0 关闭写校验
              1 打开写校验
       1 - 7 位保留, 置 0
    DL = 驱动器号
    DS:DI = 磁盘地址数据包(DAP)
返回:
    CF = 0, AH = 0 成功
    CF = 1, AH = 错误码

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

4) 校验扇区
入口:
    AH = 44h
    DL = 驱动器号
    DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:
    CF = 0, AH = 0 成功
    CF = 1, AH = 错误码

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

(未完 待续)

抱歉, 没时间了, 下回再写吧.

--

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: sillystone.bbs@smth.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.695毫秒