哎!当时懒得记笔记,到头来还是得重新回头翻书看,这次顺带把笔记做上。
CHS 和 LBA
早期的时候计算机是通过 CHS 寻址模式来定位区块的,但是弊端也很明显,区块必须将指定硬盘的柱面(Cylinder)/ 磁头 (Head)/ 扇区(Sector)三个参数来定位一个唯一的扇区地址,这套逻辑只有在硬盘操作内部有用,其他设备想要访问的话需要额外知道这些细节数据,太麻烦了,于是 LBA 应运而生。LBA 十分单纯,从 0 开始定位区块,第一个区块的 LBA=0,第二个区块的 LBA=1,以此类推,LBA 取代了 CHS,这样就能以一种相对而言更方便的方式来进行硬盘 IO。但是 LBA 只是在 CHS 上进行了抽象,实际上的硬件控制器还是需要 CHS 来进行寻址的,但是我们现在使用 LBA 给传入的是 0 1 2 3 之类的数字,硬件控制器又该如何通过 LBA 转换成正确的 CHS 呢?
CHS 和 LBA 的相互转换
CHS 地址可用以下公式转成 LBA,
1 | #c、#h、#s分别是磁柱、磁头、扇区的编号 |
LBA 可用以下公式对应到 CHS:
#c=#lba/(S*H)
#h=(#lba/S)%H
#s=(#lba%S)+1
其中,
\SHU/ 是整数除法
% 是取整数除法中的余数
请注意,当今的磁盘使用 ZBR (Zone Bit Recording, 等密度记录) 方式,实际的每轨扇区数得根据它是哪一轨。不过磁盘还是会提供这个参数来符合公式,内部再自动调整。
ZBR 又是个啥玩意
首先我们都知道每个磁道上又划分出了多个区域,每个区域叫做扇区,并且每个扇区的大小是固定的 512 字节。读取数据的时候,只需要通过这个划分就能够知道数据在哪个磁道、哪个扇区了。但是有一个问题,那就是不同的磁道扇区数是相同的,扇区所在的磁道半径约大,则扇区的面积就越大。但无论面积比靠内磁道的扇区大多少,按照设计、规定只能存储 512 字节的数据,这样一来会浪费大量的存储空间。
ZBR 就是解决这个问题的,简单说就是以前的标准外层和内层的扇区数量是固定的,你想想,外层是不是利用效率下降了,就提出来 ZBR 方案,外层的磁道扇区数量给分多点,让每个空间都能被利用到,提高磁盘的利用空间。实际的每轨扇区数得根据它是哪一轨。不过磁盘还是会提供这个参数来符合公式,内部再自动调整。
其它公式:
#lba/S=q % r
#s=1+r
q/H=#c % h
例如:
CHS 总数 =[600, 10, 84],求 #lba=1234 所对应的 CHS 编号:
1234/84=14 余 58
#s=1+58=59
14/10=1 余 4
#c=1
#h=4
#chs=(1, 4, 59)
验算: (1*10+4)*84+59-1=14*84+58=1234
目前主要有的是:LBA28 和 LBA48。LBA28 就是使用 28 位比特来描述一个扇区的地址,最大寻址有 2 的 28 次方个扇区。每个扇区有 512 字节,计算可得最大支持 128GB,128GB 明显不够现在使用,LBA48 也是同理,感兴趣的可以计算一下 LBA48 最大寻址有多少 TB。
通道和主从盘
通常情况下,一个主板支持 4 块 IDE(PATA 接口)硬盘,所以主板上提供了两个 IDE 插槽,这两个接口分别是:IDE0 和 IDE1。这两个接口被成为通道,IDE0 叫做 Primary
通道,IDE1 叫做 Secondary
通道。SATA 硬盘也兼容 PATA 的编程接口。这里每个通道分别主盘和从盘。
端口控制器主要端口寄存器
先说主要流程:
- 先判断自己要处理哪个通道的硬盘。
Primary
通道用0x1fx
接口,Secondary
通道用0x17x
接口。 - 判断自己处理主盘还是从盘?读操作或者写操作?
- 后续具体的 LBA 地址,操作扇区数量等下面会详细说明。