BBS水木清华站∶精华区

发信人: suzhe (I Love Linux), 信区: Linux        
标  题: Harddisk,Partition,Boot,OSLoader专题(3) 
发信站: 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 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.26.12] 

BBS水木清华站∶精华区