基本INT13调用参数如下(以读磁盘扇区为例):

AH=02H    功能代码,02为读扇区
AL=所需读取扇区数
CH=柱面号(10位柱面号的低八位)
CL=扇区号(7-6位是10位柱面号的高2位,5-0是扇区号)
DH=磁头号
DL=驱动器号
ES:BX=数据缓冲区地址

X86结构的4个16位通用寄存器中的AX用来表示需要使用INT13的功能(读、写、格式化等等)和扇区数量,BX作为指针指示读取或写入数据的缓冲区地址,因此只剩CX和DX两个16位寄存器(也可看作4个8位寄存器)用来表示磁盘扇区地址,正好可以和磁盘I/O接口(ATA)的4个8位地址寄存器(柱面低位寄存器、柱面高位寄存器、扇区寄存器、设备/磁头寄存器)对应。不过,早期BIOS认为每道扇区数不会超过64,柱面数不会超过1024,所以恰好用CL中的6位表示扇区数,余下两位和CH一起表示柱面号,也就是恰好用CX表示柱面/扇区,DX就用来表示磁头/驱动器。这里可以看到,由于BIOS的设计,本来CPU和底层I/O之间恰好可以一一对应的寄存器,变得不对应了,柱面低位寄存器、柱面高位寄存器、扇区寄存器3个8位寄存器被挤在CX里,腾出来的DX用来表示设备/磁头倒是绰绰有余,但由于底层I/O只有一个8位的寄存器,所以BIOS中用来表示设备/磁头的DH、DL实际上只能分别用到其中4位。综合起来就是:I/O设计者认为磁头数不可能超过16,而BIOS设计者认为每道扇区数不会超过64(实际上是63,因为扇区号是从1开始编址),柱面数不会超过1024,所以,早期磁盘不超过1024×16×63=1032192扇区,以每扇区512字节计算就是528482304字节,用硬盘厂商的表示法就是528兆。这就是第1个硬盘容量限制。

528M容量限制的主要原因是BIOS的磁盘中断INT13没有充分用到磁盘I/O接口的4个8位地址寄存器,最简单的解决办法就是把28位(4个8位寄存器共32位,但有4位用于设备导寻址,实际在一个磁盘中表示扇区地址的也只有28位)地址都利用起来,只需要把DL中未用到的4位利用起来即可,这样,INT13的调用接口不用改变,这就是所谓的Large模式。有两种方案,一种是移位法,当磁盘柱面数大于1024时,就把柱面数除以2(右移一位),而磁头数乘以2(左移一位),如果柱面数除以2以后还大于1024,再进行一次移位,这样,BIOS中用于表示磁头的DL的8位都可以全部利用起来,最大寻址扇区数可达1024×256×63=16515072,大约是8.45G。另一种是LBA辅助转换法,LBA即为逻辑块寻址,也就是扇区顺序编址,LBA是线性编址,转换为CHS地址需要知道柱面数和每道扇区数,一般柱面数为255每道扇区数为63,转换就是一些求模取余的运算,在INT13调用接口不变,用LBA辅助转换法柱面数最大只能达到255,可寻址扇区数要略小于移位法,要少1024×63=64512扇区,大约33M。这两种方案容量限制都是8G多点,这就是第2个硬盘容量限制。

前面可以看到,INT13如此扩展还是没有充分利用28位扇区地址,因为用于表示扇区号的6位本可以表示64个扇区,但实际只用来表示1到63个扇区,这是CHS模式下的习惯,扇区号总是从1开始而不是从0开始。对于硬盘厂商而言,要突破8G容量限制,只需采用LBA寻址方式,接口寄存器数量都不需要扩展,就可以轻松地表示2^28=268435456个扇区,大约是137G。对于BIOS厂商而言,如果要保持INT13调用接口不变就必然要出现第0扇区这种不符合CHS结构的扇区地址,虽然接口不变但已经不能向下兼容,即便如此,最多也只能跟进到137G的第3个容量限制,硬盘容量再往后发展INT13要想再保持调用接口不变已无可能,故,BIOS对INT13进行了扩展,不再用寄存器直接传递地址,而是用一个数据结构来表示扇区地址以及读/写数据的地址等信息。可以看到,扩展INT13一下子将扇区地址的位数扩展到了64位,底层磁盘支持多少位的LBA地址,就传递多少位到底层,即使磁盘I/O扩展寄存器,只要不超过64位,扩展INT13的接口都不需要改变。日前最新的ATA-5规范是48位LBA,大约是144PB(相当于144000GB),注意是PB,在较长时间内应该还是个天文数字,如果64位全部用完,应该是它的65536倍!!如此,BIOS通过扩展突破了8G限制,而137G限制主要是磁盘I/O的问题,当然扩展INT13从64位中取多少位传递给底层这一点应该也是要扩展的,但接口不需改变,能保持向下兼容的同时轻松突破137G限制。

AH=42H    功能代码,42为扩展读扇区
DL = 驱动器号
DS:SI=指向LBA地址包的指针
地址包定义:
偏移          大小                    描述
00H           字节        地址包大小
01H           字节     保留(为0)
02H             字          传输包个数
04H           双字    指向数据指针
08H           4字            起始地址
其中LBA=((柱面*磁头/柱面+磁头)*扇区/柱面)+扇区-1

前面的3种容量限制主要是BIOS和磁盘I/O接口的限制,实际使用中,还会受到其他的一些限制,比如FAT文件系统就不支持2G以上的分区。但使用FAT文件系统的DOS、win95等操作系统已自然淘汰,当然也就不会存在这些麻烦。但有一个限制依然会遇到,那就是分区表。传统的分区表被称为MBR分区表,用16个字节表示一个分区项,其中:

字节	含义
0	Activeflag.活动标志.若为0x80H,则表示该分区为活动分区.若为0x00H,则表示该分区为非活动分区.
1,2,3	该分区的起始磁头号,扇区号,柱面号磁头号 -- 1字节, 扇区号 -- 2字节低6位,柱面号 -- 2字节高2位 + 3字节
4	分区文件系统标志:
分区未用: 0x00H.
扩展分区: 0x05H, 0x0FH.
FAT16分区: 0x06H.
FAT32分区: 0x0BH, 0x1BH, 0x0CH, 0x1CH.
NTFS分区: 0x07H.
5,6,7	该分区的结束磁头号,扇区号,柱面号,含义同上.
8,9,10,11	逻辑起始扇区号。表示分区起点之前已用了的扇区数.
12,13,14,15	该分区所占用的扇区数.

可以看出其中的1,2,3字节和5,6,7字节对应基本INT13的DH,CL,CH,在CHS时代,后面的8——15字节似乎没有什么用处,但是当磁盘容量大于8G以后,这几个字节就很有用了,它位就是分区的起始LBA地址!!8G以后的空间,1,2,3、5,6,7已经无法表示,就在1,2,3或5,6,7处填上FE FF FF(就是CHS方式能够表示的最大地址),程序读到CHS地址是FEFFFF时,就知道CHS方式已经到顶了,必须使用LBA了,然后就直接使用这几个字节。在还没有LBA概念的时代设计出这样的分区表结构的人真是天才,似乎早就预料到唯有LBA才能解决硬盘容量限制,不过,它只有32位,只能表示2T(2000G),现在已经有2T的硬盘产品出现,大于2T的硬盘如果还使用MBR分区,就无法使用2T以后的空间。这个时候就只有使用GPT分区表,在GPT分区表中,LBA地址用8字节表示,也就是64位,这样就突破了2T的限制。但是,使用GPT分区就不能和MBR共存,一个磁盘要么采用MBR要么采用GPT,另外,操作系统识别并使用GPT分区的磁盘不难,但支持从GPT分区引导的操作系统却不多。MS的操作系统需要VISTA以上才支持,并且还需可扩展固件接口 (EFI)支持。