int 13h 返回信息

BIOS磁盘操作:INT 13H

BIOS磁盘操作:INT 13H

BIOS磁盘操作 INT 13H 处理的记录都是一个扇区大小,以实际的磁道号和扇区号寻址.

AH

执行操作

入口参数

返回参数

00H

复位磁盘系统

DL=驱动器号

失败: AH=错误码

01H

读磁盘状态

 

AH=状态字节

02H

读磁盘

AL= 扇区数

(CL)6,7 (CH)0~7=柱面/磁道号

(CL)0~5= 扇区号

DH= 磁头号/盘面

DL= 驱动器号

ES:BX= 数据区中I/O缓冲区的地址

成功: AH=0, AL=读取的扇区数

失败: AH=错误码

03H

写磁盘

成功: AH=0, AL=写入的扇区数

失败: AH=错误码

04H

检验磁盘扇区

ALCLCHDHDL定义同上,无ES:BX

成功: AH=0,AL=检验的扇区数

失败: AH=错误码

05H

格式化盘磁道

ALCLCHDHDL定义同上

ES:BX= 格式化参数表指针

成功: AH=0

失败: AH=错误码

注: 驱动器号(软盘00H=A,01H=B...,  硬盘80H=C,81H=D...)

 

 

扩展 Int13H 技术资料
一. 简介
设计扩展 Int13H 接口的目的是为了扩展 BIOS的功能, 使其支持多于1024柱面的硬盘, 以及可移动介质的琐定, 解锁及弹出等功能.
 
二. 数据结构

1. 数据类型约定

BYTE   1字节整型 ( 8 位 )

DWORD  4字节整型 ( 32 位 )

WORD  2字节整型 ( 16 位 )

QWORD  8字节整型 ( 64 位 )

 

2. 磁盘地址数据包 Disk Address Packet (DAP)
DAP是基于绝对扇区地址的,因此利用DAP,Int13H可以轻松地逾越1024柱面的限制,因为它根本就不需要CHS的概念.
struct    DiskAddressPacket {

 

BYTE

PacketSize;

数据包尺寸(16字节)

 

BYTE

Reserved;

==0

 

WORD

BlockCount;

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

 

DWORD

BufferAddr;

传输缓冲地址(segment:offset)

 

QWORD

BlockNum;

磁盘起始绝对块地址

};

参数信息:

PacketSize

保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ).

BlockCount

对于输入来说是需要传输的数据块总数, 对于输出来说是实际传输的数据块个数. BlockCount = 0 表示不传输任何数据块.

BufferAddr

是传输数据缓冲区的 32 位地址 (段地址:偏移量). 数据缓冲区必须位于常规内存以内(1M).

BlockNum

表示的是从磁盘开始算起的绝对块地址(以扇区为单位),与分区无关. 第一个块地址为 0. 一般来说, BlockNumCHS 地址的关系是:

    BlockNum = Cylinder * NumberOfHeads + Head * SectorsPerTrack + Sector - 1;
其中 Cylinder, Head, SectorCHS 地址, NumberOfHeads 是磁盘的磁头数, SectorsPerTrack 是磁盘每磁道的扇区数.也就是说 BlockNum 是沿着 扇区->磁道->柱面 的顺序记数的. 这一顺序是由磁盘控制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序).

 

 

3. 驱动器参数数据包 Drive Parameters Packet
驱动器参数数据包是在扩展 Int13H的取得驱动器参数子功能调用中使用的数据包. 格式如下:
struct    DriveParametersPacket {

 

WORD

InfoSize;

数据包尺寸 (26 字节)

 

WORD

Flags;

信息标志

 

DWORD

Cylinders;

磁盘柱面数

 

DWORD

Heads;

磁盘磁头数

 

DWORD

SectorsPerTrack;

每磁道扇区数

 

QWORD

Sectors;

磁盘总扇区数

 

WORD

SectorSize;

扇区尺寸 (以字节为单位)

};

WORD Flags信息标志用于返回磁盘的附加信息, 每一位的定义如下:

0

0 = 可能发生 DMA 边界错误

1 = DMA边界错误将被透明处理,表示BIOS将自动处理DMA边界错误错误代码09H永远也不会出现.

1

0 = 未提供CHS 信息 (如果块设备的传统 CHS 几何信息不适当的话, 该位将置0.)

1 = CHS 信息合法

2

0 = 驱动器不可移动 1 = 驱动器可移动

3

表示该驱动器是否支持写入时校验.

4

0 = 驱动器不具备介质更换检测线    1 = 驱动器具备介质更换检测线

5

0 = 驱动器不可锁定 (某些驱动器号为 0 0x7F 的设备也需要置位)

1 = 驱动器可以锁定 (要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置1)

6

0 = CHS 值是当前存储介质的值 (仅对于可移动介质), 如果驱动器中有存储介质, CHS 值将被返回.
1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质).

7 - 15

保留, 必须置 0


 
. 接口规范
1. 寄存器约定
在扩展 Int13H 调用中一般使用如下寄存器约定:
DS:DI ==> 磁盘地址数据包
( disk address packet )
DL ==>
驱动器号
AH ==> 功能代码 / 返回码
    在基本Int13H 调用中, 0 - 0x7F 之间的驱动器号代表可移动驱动器, 0x80 - 0xFF 之间的驱动器号代表固定驱动器. 但在扩展Int13H调用中0x80 - 0xFF之间还包括一些新出现的可移动驱动器, 如活动硬盘等.这些驱动器支持先进的锁定/解锁等功能.
 

ah 返回的错误码除了标准 Int13H 调用规定的基本错误码以外,又增加了以下错误码:

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

B3h 介质正在被使用

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

B4h 锁定记数溢出

B2h 介质是可移动的

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 详解

AH

执行操作

入口参数

返回参数

41H

检验扩展功能

是否存在

BX = 55AAH

DL = 驱动器号

CF = 0: AH = 扩展功能的主版本号 AL = 内部使用
        BX = AA55H  CX = API 子集支持位图
CF = 1: AH = 错误码 01H, 无效命令 详细信息

42H 

扩展读

DL = 驱动器号
DS:DI =(DAP)

CF = 0, AH = 0 成功
CF = 1, AH = 错误码

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

43H

扩展写

AL: 0[0时关闭写校验,

1时打开写校验

1 - 7位保留,0


DL = 驱动器号 

DS:DI =(DAP)

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

44H

校验扇区

DL = 驱动器号

DS:DI = (DAP)

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

45H

锁定/解锁

驱动器

DL = 驱动器号
AL = 00 锁定驱动器

AL = 01 驱动器解锁
AL = 02 返回锁定/解锁状态 AL = 03h-FFh - 保留

CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用用来锁定指定驱动器中的介质.详细信息

46H

弹出可移动驱动器中的介质

AL = 0保留

DL = 驱动器号

CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用用来弹出指定的可移动驱动器中的介质.详细信息

47H

扩展定位

DL = 驱动器号

DS:DI =(DAP)

CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用将磁头定位到指定扇区.

48H

取得驱动器参数

DL = 驱动器号

DS:DI = 返回数据缓冲区地址

CF = 0, AH = 0 成功  DS:DI 驱动器参数数据包地址
CF = 1, AH = 错误码 这个调用返回指定驱动器的参数.

49H

取得扩展驱动器介质更换检测线状态

DL = 驱动器号

CF = 0, AH = 0 介质未更换
CF = 1, AH = 06h 介质可能已更换
这个调用返回指定驱动器的介质更换状态.详细信息

52H

Int 15h 可移动介质弹出支持

DL = 驱动器号

CF = 0, AH = 0 弹出请求可能可以执行
CF = 1, AH = 错误码 B1h B3h 弹出请求不能执行
这个调用是由 Int13h AH=46h 弹出介质功能调用内部使用的.

 

原文链接:http://blog.csdn.net/nydzdoking/article/details/3753804

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值