柱面,盘片,盘面,扇面,磁头,磁道,扇区,CHS地址,LAB地址^1^
CHS地址
CHS地址指的是柱面(Cylinder)、磁头(Head)、扇区(Sector)三个参数组成的地址,是用来表示磁盘上每个扇区位置的一种方式。
物理扇区号 = ((柱面号×磁头数) + 磁头号) × 每磁道扇区数 + 扇区偏移量 - 1
其中:
柱面号从0开始编号;
磁头号从0开始编号;
扇区号从1开始编号;
扇区偏移量指的是在某个磁头的某个柱面上的扇区位置偏移量,从1开始编号。
例如,假设某个磁盘有16384个柱面,16个磁头,每个磁头有63个扇区,每个扇区大小为512字节,要计算某个扇区的物理位置,其CHS地址为(1234, 5, 6),则计算过程如下:
物理扇区号 = ((1234 × 16) + 5) × 63 + 6 - 1 = 1257983
物理位置 = 1257983 × 512 = 644022016
LAB地址
LBA地址(Logical Block Addressing)是一种直接以扇区为单位来寻址的方式。
硬盘上的数据定位
每个扇区可存储128×2的N次方(N=0.1.2.3)字节的数据(一般为512B),扇区为数据存储的最小单元,从上图可知,外圈的扇区面积比内圈大,为何存储的数据量相同,这是因为内外圈使用的磁物质密度不同,但现在的硬盘已经采用内外圈同密度物质来存储数据了,以减少类似"大面积小数据"的浪费情况。(此时的内外磁道的扇区数量将不同,具体细节省略)
有了扇区(sector),有了柱面(cylinder),有了磁头(head),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS(也称3D),对早期的磁盘(上图所示)非常有效,知道用哪个磁头,读取哪个柱面上的第几扇区就OK了。CHS模式支持的硬盘容量有限,用8bit来存储磁头地址,用10bit来存储柱面地址,用6bit来存储扇区地址,而一个扇区共有512Byte,这样使用CHS寻址一块硬盘最大容量为256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B来算就是8.4GB)
但现在很多硬盘采用同密度盘片,意味着内外磁道上的扇区数量不同,扇区数量增加,容量增加,3D很难定位寻址,新的寻址模式:LBA(Logical Block Addressing)。在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。LBA编址方式将CHS这种三维寻址方式转变为一维的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为一线性的编号,系统效率得到大大提高,避免了烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器再将这种逻辑地址转换为实际硬盘的物理地址。
LBA下的编号,扇区编号是从0开始。
逻辑扇区号LBA的公式:
LBA(逻辑扇区号)=磁头数 × 每磁道扇区数 × 当前所在柱面号 + 每磁道扇区数 × 当前所在磁头号 + 当前所在扇区号 -- 1
例如:CHS=0/0/1,则根据公式LBA=255 × 63 × 0 + 63 × 0 + 1 -- 1= 0
也就是说物理0柱面0磁头1扇区,是逻辑0扇区。
柱面(cylinder),盘片(platter), 盘面(Side), 扇面,磁头(head), 磁道(track), 扇区(sector)
- 柱面
所有盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),每个圆柱上的磁头由上而下从"0"开始编号。数据的读/写按柱面进行,即磁 头读/写数据时首先在同一柱面内从"0"磁头开始进行操作,依次向下在同一柱面的不同盘面即磁头上进行操作,只在同一柱面所有的磁头全部读/写完毕后磁头 才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。电子切换相当快,比在机械上磁头向邻近磁道移动快得多,所以,数据 的读/写按柱面进行,而不按盘面进行。也就是说,一个磁道写满数据后,就在同一柱面的下一个盘面来写,一个柱面写满后,才移到下一个扇区开始写数据。读数据也按照这种方式进行,这样就提高了硬盘的读/写效率。
一块硬盘驱动器的圆柱数(或每个盘面的磁道数)既取决于每条磁道的宽窄(同样,也与磁头的大小有关),也取决于定位机构所决定的磁道间步距的大小。
- 盘面
一个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利 用,都可以存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数。每一个这样的有效盘面都有一个盘面号,按顺序从上至下从"0"开始依次编号。在硬盘系 统中,盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头。硬盘的盘片组在2~14片不等,通常有2~3个盘片,故盘面号(磁头号)为0~3或 0~5。
- 磁道
磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。磁道从外向内从0开始顺序编号。硬盘的每一个盘面有300~1 024个磁道,新式大容量硬盘每面的磁道数更多。信息以脉冲串的形式记录在这些轨迹中,这些同心圆不是连续记录数据,而是被划分成一段段的圆弧,这些圆弧 的角速度一样。由于径向长度不一样,所以,线速度也不一样,外圈的线速度较内圈的线速度大,即同样的转速下,外圈在同样时间段里,划过的圆弧长度要比内圈 划过的圆弧长度大。每段圆弧叫做一个扇区,扇区从"1"开始编号,每个扇区中的数据作为一个单元同时读出或写入。一个标准的3.5寸硬盘盘面通常有几百到 几千条磁道。磁道是"看"不见的,只是盘面上以特殊形式磁化了的一些磁化区,在磁盘格式化时就已规划完毕。
4.扇区
操作系统以扇区(Sector)形式将信息存储在硬盘上,每个扇区包括512个字节的数据和一些其他信息。一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。
扇区的第一个主要部分是标识符。标识符,就是扇区头标,包括组成扇区三维地址的三个数字:扇区所在的磁头(或盘面)、磁道(或柱面号)以及扇区在磁 道上的位置即扇区号。头标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些硬盘控制器在扇区头标中 还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束,以供控制器检验扇区头标的读出情况, 确保准确无误。
扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的ECC数字填入这个部分。
5、硬盘的读写原理
系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先是第1磁道的第一磁头下(也就是第1盘面的第一磁道)的所有扇区,然后,是同一柱面的下一磁头,......,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。
系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则 直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与 期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路, 还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然 后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁盘继续旋转。
磁盘的读写顺序都是从盘片的最外面开始向内读写,也就是从1柱面1磁道1扇区开始(0柱面0磁道1扇区为磁盘主引导扇区),然后寻道找到对应的扇区,再根据读写情况,切换电路对磁盘进行或读或写操作。但如果扇区编号(保存在扇区头标)是按1,2,3的数字顺序排列下去,那就可能出现一个读写效率的问题。比如扇区编号是按上面的情况排列在磁道上,那么当磁头对扇区1读写完成后,如果由于盘片的旋转速度过快或磁盘数据读写速度过慢,以致磁头准备对扇区2进行读写时,磁头却转到扇区2中间,磁道上的扇区间隔已不足以为磁盘提供读写下一扇区的准备时间,那么磁盘就需旋转一周后回头再对扇区2进行读写。这样的话,磁盘读写一道磁道时,磁盘旋转的周数就等于该磁道上的扇区数,这将大大降低磁盘的读写速率。因此,IBM的一位工程师就创出一种"交叉因子编码"的方式来对扇区进行编号。比如交叉因子为2:1,也就是1与2之间相差两扇区(比如第一位为扇区1,那么扇区2就在第三位),2与3也是如此,以此类推。如果磁盘旋转通过扇区1、2之间的间隔的时间小于磁盘的准备时间,那么读完一磁道的数据就需要磁盘旋转两周,否则就需旋转一磁道的扇区数。若是"准备时间"仍不足的话可以用交叉因子为3:1。因此通过交叉因子编码可以大大地提高磁盘读写速率,并充分利用磁盘空间,防止资源浪费。
6、硬盘上的引导信息
硬盘的第一个扇区被称之为Boot Sector。由MBR (MasterBoot Record)、DPT (Disk Partition Table) 和 Boot Record ID 三部分组成。
MBR又称作主引导记录,占用 Boot Sector 的前 446 个字节(0 ~ 0x1BD)。存放系统主引导程序,负责从活动分区中装载并运行系统引导程序。
DPT 即主分区表,占用 64 个字节 (0x1BE ~ 0x1FD),记录了磁盘的基本分区信息。主分区表分为四个分区项,每项 16 字节,分别记录了每个主分区的信息 (因此最多可以有 4 个主分区)。
Boot Record ID 即引导区标记,占用两个字节 (0x1FE ~ 0x1FF)。对于合法引导区,它等于 0xAA55,这是判别引导区是否合法的标志。