注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。

本课时简要介绍磁盘的另一种读取方法:LBA模式。具体来说,采用的是LBA48模式。进入保护模式后,无法使用BIOS中断的磁盘读取服务。由于读取的磁盘数据会放在1MB以上的内存区域,所以也不便于在进入保护模式前使用BIOS的磁盘读取服务来读取。

LBA48模式

LBA48模式将硬盘上所有的扇区看成线性排列,没有磁盘、柱面等概念,因此访问起来更加简单,序号从0开始。其访问序列如下:

outb(0x1F6, 0x40 | (slavebit << 4)) 选择硬盘:主盘或从盘

outb (0x1F2, sectorcount high byte) outb (0x1F3, LBA4) outb (0x1F4, LBA5) outb (0x1F5, LBA6)

outb (0x1F2, sectorcount low byte) outb (0x1F3, LBA1) outb (0x1F4, LBA2) outb (0x1F5, LBA3)

Send the “READ SECTORS EXT” command (0x24) to port 0x1F7: outb(0x1F7, 0x24)

各寄存器说明如下:(仅列出与课程程序相关的说明)

寄存器偏移 读写 功能
0 R/W 数据寄存器
1 R 错误寄存器
1 W 特性寄存器
2 R/W 扇区数量寄存器
3 R/W Sector Number Register (LBAlo)
4 R/W Cylinder Low Register / (LBAmid)
5 R/W Cylinder High Register / (LBAhi)
6 R/W Drive / Head Register
7 R 状态寄存器
7 W 命令寄存器

其中0x1F6寄存器(Drive / Head)对应的位如下:

名称 功能
0 - 3 在, bits 24 to 27 of the block number.
4 DRV 驱动器号
5 1
6 LBA 对LBA模式,总为1
7 1

Status Register (I/O base + 7)

名称 功能
0 ERR 发生错误
1 IDX
2 CORR
3 DRQ 就绪,可以写数据或者读取数据
4 SRV
5 DF
6 RDY
7 BSY

参考资料