哎!当时懒得记笔记,到头来还是得重新回头翻书看,这次顺带把笔记做上。
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地址,操作扇区数量等下面会详细说明。