硬盘上有两个 ATA 通道,也称为 IDE 通道。
- 第一个 ATA 通道上的两个硬盘(主盘和从盘)的中断信号挂在 8259A 从盘的 IRQ14 上。两个硬盘共享同一个 IRQ 接口。
- 第二个 ATA 通道接在 8259A 从片的 IRQ15 上,该 ATA 通道上可支持两个硬盘。
硬件发生中断时,如何区分中断来自那个硬盘?
- 我们对硬盘发命令时,需要提前指定主盘还是从盘。这是在硬盘控制器的 device 寄存器中第 4 位的 dev 位指定的。因此也就知道是哪个硬盘来了中断信号。
- 但在硬盘完成操作后,它还得通知调用者任务执行的结果,是顺利完成,还是失败,如果是读硬盘的话,现在可以取数据了,这里是让硬盘主动发中断来通知调用者的。但一个通道只能有一个中断,却有两个硬盘。因此一次只允许通道中的一个硬盘操作。因此在通道中设置锁来实现互斥,对通道中的任何一个硬盘操作时都要申请该锁来实现独享通道。
中断处理完成后,需要显示通知硬盘控制器此次中断已经处理完成,否则硬盘便不会产生新的中断,这也是为了保证数据的有效性和安全性。硬盘控制器的中断在下列情况下会被清掉:
- 读取了 status 寄存器
- 发出了 reset 命令
- 或者又向硬盘 cmd 寄存器写入了新的命令
linux 中对于硬盘的命令规则是:[x]d[y][n]
,其中只有字母 d 是固定的,其他带中括号的字符都是多选值
x
表示硬盘分类,硬盘有两大类,IDE 磁盘和 SCSI 磁盘。h 代表 IDE 磁盘,s 代表 SCSI 磁盘,故 x 取值为 h 和 s- d 表示 disk,表示磁盘
- y 表示设备号,以区分第几个设备,取值范围是小写字符,其中 a 是第一个硬盘,b 是第二个硬盘,依次类推
- n 表示分区号,也就是一个硬盘上的第几个分区。分区以数字 1 开始,依次类推
比如,sda1
表示第一个 SCSI 硬盘的第一个分区