第二部分 技术资料
第一章 扩展 Int13H 技术资料

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

二. 数据结构

1. 数据类型约定
  BYTE  1 字节整型 ( 8 位 )
  WORD  2 字节整型 ( 16 位 )
  DWORD 4 字节整型 ( 32 位 )
  QWORD 8 字节整型 ( 64 位 )

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

  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. 一般来说, BlockNum 与 CHS地址的关系是:
  BlockNum = cylinder * NumberOfHeads +
       head *SectorsPerTrack +
       sector – 1;

  其中 cylinder, head, sector 是 CHS 地址,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;    // 扇区尺寸 (以字节为单位)
  };
  信息标志用于返回磁盘的附加信息, 每一位的定义如下:

  0 位:
    0 = 可能发生 DMA 边界错误
    1 = DMA 边界错误将被透明处理
    如果这位置 1, 表示 BIOS 将自动处理 DMA边界错误, 也就是说
    错误代码 09H 永远也不会出现.

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

  2 位:
    0 = 驱动器不可移动
    1 = 驱动器可移动

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

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

  5 位:
    0 = 驱动器不可锁定
    1 = 驱动器可以锁定
    要存取驱动器号大于 0×80 的可移动驱动器,该位必须置 1
    (某些驱动器号为 0 到 0×7F的设备也需要置位)
  6 位:
    0 = CHS 值是当前存储介质的值(仅对于可移动介质), 如果
    驱动器中有存储介质, CHS 值将被返回.
    1 = CHS 值是驱动器支持的最大值(此时驱动器中没有介质).

  7 – 15 位: 保留, 必须置 0.


评论

该日志第一篇评论

发表评论

评论也有版权!