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

发信人: suzhe (I Love Linux), 信区: Linux       
发信站: BBS 水木清华站 (Mon Nov 22 14:35:19 1999)

    第二部分 技术资料
第一章 扩展 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 = 驱动器可以锁定
        要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置 1
        (某些驱动器号为 0 到 0x7F 的设备也需要置位)

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

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

(未完 待续)


    

--

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