元芳你怎么看

本网站主要用于记录我个人学习的内容,希望对你有所帮助

0%

硬件控制器端口

哎!当时懒得记笔记,到头来还是得重新回头翻书看,这次顺带把笔记做上。

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
2
3
4
5
#c、#h、#s分别是磁柱、磁头、扇区的编号
#lba是逻辑区块编号
H=heads per cylinder,每个磁柱的磁头数
S=sectors per track,每磁道的扇区数
#lba=(#c*H+#h)*S+#s-1

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 的编程接口。这里每个通道分别主盘和从盘。

端口控制器主要端口寄存器

先说主要流程:

  1. 先判断自己要处理哪个通道的硬盘。Primary 通道用 0x1fx 接口,Secondary 通道用 0x17x 接口。
  2. 判断自己处理主盘还是从盘?读操作或者写操作?
  3. 后续具体的 LBA 地址,操作扇区数量等下面会详细说明。