本课时简要介绍磁盘的另一种读取方法: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    忙

参考资料

● 硬盘访问模式及相关寄存器:https://wiki.osdev.org/ATA_PIO_Mode



登陆发表评论