📄 00000004.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: suzhe (I Love Linux), 信区: Linux <BR>标 题: Harddisk,Partition,Boot,OSLoader专题(3) <BR>发信站: BBS 水木清华站 (Mon Nov 22 14:35:19 1999) <BR> <BR> 第二部分 技术资料 <BR>第一章 扩展 Int13H 技术资料 <BR> <BR>一. 简介 <BR> 设计扩展 Int13H 接口的目的是为了扩展 BIOS 的功能, 使其支持 <BR>多于1024柱面的硬盘, 以及可移动介质的琐定, 解锁及弹出等功能. <BR> <BR>二. 数据结构 <BR> <BR>1. 数据类型约定 <BR> BYTE 1 字节整型 ( 8 位 ) <BR> WORD 2 字节整型 ( 16 位 ) <BR> DWORD 4 字节整型 ( 32 位 ) <BR> QWORD 8 字节整型 ( 64 位 ) <BR> <BR>2. 磁盘地址数据包 Disk Address Packet (DAP) <BR> DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾 <BR>越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念. <BR> DAP 的结构如下: <BR> <BR> struct DiskAddressPacket <BR> { <BR> BYTE PacketSize; // 数据包尺寸(16字节) <BR> BYTE Reserved; // ==0 <BR> WORD BlockCount; // 要传输的数据块个数(以扇区为单位) <BR> DWORD BufferAddr; // 传输缓冲地址(segment:offset) <BR> QWORD BlockNum; // 磁盘起始绝对块地址 <BR> }; <BR> <BR> PacketSize 保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在 <BR>目前使用的扩展 Int13H 版本中 PacketSize 恒等于 16. 如果它小于 <BR>16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ). <BR> BlockCount 对于输入来说是需要传输的数据块总数, 对于输出来说 <BR>是实际传输的数据块个数. BlockCount = 0 表示不传输任何数据块. <BR> BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:偏移量). 数据 <BR>缓冲区必须位于常规内存以内(1M). <BR> BlockNum 表示的是从磁盘开始算起的绝对块地址(以扇区为单位), <BR>与分区无关. 第一个块地址为 0. 一般来说, BlockNum 与 CHS 地址的关系 <BR>是: <BR> BlockNum = cylinder * NumberOfHeads + <BR> head * SectorsPerTrack + <BR> sector - 1; <BR> <BR> 其中 cylinder, head, sector 是 CHS 地址, NumberOfHeads 是磁盘 <BR>的磁头数, SectorsPerTrack 是磁盘每磁道的扇区数. <BR> 也就是说 BlockNum 是沿着 扇区->磁道->柱面 的顺序记数的. 这一顺 <BR>序是由磁盘控制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同 <BR>(如为了提高磁盘速度而设置的间隔因子将会打乱扇区的排列顺序). <BR> <BR>3. 驱动器参数数据包 Drive Parameters Packet <BR> 驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中 <BR>使用的数据包. 格式如下: <BR> struct DriveParametersPacket <BR> { <BR> WORD InfoSize; // 数据包尺寸 (26 字节) <BR> WORD Flags; // 信息标志 <BR> DWORD Cylinders; // 磁盘柱面数 <BR> DWORD Heads; // 磁盘磁头数 <BR> DWORD SectorsPerTrack; // 每磁道扇区数 <BR> QWORD Sectors; // 磁盘总扇区数 <BR> WORD SectorSize; // 扇区尺寸 (以字节为单位) <BR> }; <BR> 信息标志用于返回磁盘的附加信息, 每一位的定义如下: <BR> <BR> 0 位: <BR> 0 = 可能发生 DMA 边界错误 <BR> 1 = DMA 边界错误将被透明处理 <BR> 如果这位置 1, 表示 BIOS 将自动处理 DMA 边界错误, 也就是说 <BR> 错误代码 09H 永远也不会出现. <BR> <BR> 1 位: <BR> 0 = 未提供 CHS 信息 <BR> 1 = CHS 信息合法 <BR> 如果块设备的传统 CHS 几何信息不适当的话, 该位将置 0. <BR> <BR> 2 位: <BR> 0 = 驱动器不可移动 <BR> 1 = 驱动器可移动 <BR> <BR> 3 位: 表示该驱动器是否支持写入时校验. <BR> <BR> 4 位: <BR> 0 = 驱动器不具备介质更换检测线 <BR> 1 = 驱动器具备介质更换检测线 <BR> <BR> 5 位: <BR> 0 = 驱动器不可锁定 <BR> 1 = 驱动器可以锁定 <BR> 要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置 1 <BR> (某些驱动器号为 0 到 0x7F 的设备也需要置位) <BR> <BR> 6 位: <BR> 0 = CHS 值是当前存储介质的值 (仅对于可移动介质), 如果 <BR> 驱动器中有存储介质, CHS 值将被返回. <BR> 1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质). <BR> <BR> 7 - 15 位: 保留, 必须置 0. <BR> <BR>(未完 待续) <BR> <BR> <BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.26.12] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -