第十三页下边一段:
“第0x1F3~0x1F6 4个字节的端口地址是用来写入LBA地址的,那么1000号逻辑扇区的LBA地址为0x000003E8,所以我们需要往0x1F3、0x1F4写入0x00,往0x1F5写入0x03,往0x1F6写入0xE8。”
以及下面那段实例代码都是错误的。
IDE硬盘LBA系的寻址方式有28位和48位两种,上面说“4个字节”不准确。
在LBA28模式下,0x1F3~0x1F6都是8位的寄存器。0x1F3~0x1F5三个寄存器构成LBA地址的高24位,0x1F6只有低4位用来构成LBA地址的低4位。
0x1F6又被称作HDDEVSEL(大约是Hard disk device selector的缩写),里面bit的用途如下:
Bits 0-3: CHS地址中的磁头号,或LBA地址中的低4位。
Bit 4: 置1选择第二个磁盘。
Bit 5: 保留位,不过必须置1。
Bit 6: LBA模式的开关,置1为LBA模式。
Bit 7: 保留位,也必须置1。
28位地址可以支持128GB的地址空间(2^28)。在LBA48模式下,0x1F3~0x1F6都是16位寄存器,16×3构成一个48位地址,可以寻址2TB。
在linux0.11时代的at硬盘还不具备LBA模式寻址的功能,所以赵炯完全剖析上的寻址方式还是老式各种纠结的CHS模式。
参见 http://wiki.osdev.org/IDE