二次转载他人 原文作者可留下链接 或者联系删除本文
磁盘基本构造
linux下使用fdisk指令可以查看硬盘的信息
fdisk -l
Disk /dev/hda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes (7M多每个柱面)
Device Boot Start End Blocks Id System
/dev/hda1 * 1 1217 9775521 c W95 FAT32 (LBA)
/dev/hda2 1218 16555 123202485 5 Extended
/dev/hda5 1218 3042 14659281 b W95 FAT32
/dev/hda6 3043 4867 14659281 b W95 FAT32
/dev/hda7 4868 6692 14659281 83 Linux
/dev/hda8 6693 8517 14659281 83 Linux
/dev/hda9 8518 10342 14659281 83 Linux
/dev/hda10 10343 11559 9775521 b W95 FAT32
/dev/hda11 11560 12776 9775521 83 Linux
/dev/hda12 12777 16424 29302528+ 83 Linux
/dev/hda13 16425 16551 1020096 82 Linux swap
/dev/hda14 16552 16553 16033+ 83 Linux
/dev/hda15 16554 16555 16033+ 83 Linux
以前从来都没有注意也没有去理解上面一部分的描述信息,仔细一看,发现heads的值是255,heads表示可是磁头数啊,而普通硬盘的磁头数最多也就是4个,怎么想也想不明白,于是到网上搜索了一大圈,但收获不大,然后一个同事告诉我,要我去查查CHS(物理寻址)和LBA(逻辑块寻址)它们之间的区别,经过一番搜索,终于明白heads原来是逻辑的数值,fdisk -l看到的sectors和cylinders也是逻辑的值,在LBA模式下,设置的柱面、磁头、扇区等参数并不是实际硬盘的物理参数。只是在访问硬盘时,由IDE控制器把由柱面、磁头、扇区等参数确定的逻辑地址转换为实际硬盘的物理地址。
关于硬盘的一些参数解释如下:
硬盘划分为磁头(Heads)、柱面(Cylinder)、扇区(Sector)。
△磁头(Heads):每张磁片的正反两面各有一个磁头,一个磁头对应一张磁片的一个面。因此,用第几磁头
就可以表示数据在哪个磁面。
△柱面(Cylinder):所有磁片中半径相同的同心磁道构成“柱面”,意思是这一系列的磁道垂直叠在一起,就形成一个柱面的形状。简单地理解,柱面就是磁道。
△扇区(Sector):将磁道划分为若干个小的区段,就是扇区。虽然很小,但实际是一个扇子的形状,故称为扇区。每个扇区的容量为512字节。
硬盘容量=磁头数×柱面数×扇区数×512字节
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以前见到的很多磁道的示意图都是这样的:注意标线的位置,“指向一条线”,我当时的理解好像是这条线就是磁道。还有的解释是说磁道就是一个“同心圆”的集合
那么,我的疑问就是,既然那条线是同心圆,那么两条线之间的那快空白是什么呀? 什么也不是? 空着的? 就是为了分开磁道?晕倒。那这浪费的部分也太多了吧。毕竟两条线中间部分的宽度看起来比磁道可实在是宽太多了。
后来,查了下别的图片,才发现磁道原来应该是这样子的:不是“同心圆”,应该是“同心圆环”
到此,我关于磁道的疑问才终于有了答案。
后来又联想到了其他的问题:
每个磁道上的扇区数目是一样的么?
早期的磁盘每个磁道上的扇区数目是一样,限制了磁盘的容量;后来为了增大磁盘容量采用了新技术,也就是说越往外每磁道扇区数目越多
早期的硬盘是每个磁道有相同的扇区,但是现在的硬盘采用线性寻址,所以每个磁道上扇区数不一样,外面的多,里面的少.光盘跟硬盘差不多.但是用螺线的.不像硬盘采用同心圆
不过,还是可以用CHS(柱面,磁道,扇区)的方式来定位, 因为IDE磁盘做了内部转换,让你看起来好像每条磁道上面的簇数量都是一样的
0磁道是在磁盘的外圈还是内圈
由于历史原因 , 磁盘的0磁道在最外圈(过去的老式硬盘,每条磁道上的簇的数量都是一样多的。也就是说最里面和最外面的磁道的簇的数目是一样的。显然,磁密度越低,数据的安全越有保障。而MBR放在0柱面的,第0个磁道的,第1个簇上面,为了这个关键数据的安全,所以磁道要从最外开始安排。)
但是,光盘的0磁道和磁盘,软盘刚好向盘,光盘的0磁道是在最内圈的
尽管扇区是能独立寻址的最小单位,但资源分配的最小单位是簇
所以文件的大小和文件所占用的磁盘空间是不同的。所占用的磁盘空间往往多余文件的大小
硬盘簇的大小设为多少才合适
默认的情况下,在格式化的时侯如果没有指定簇的大小,那么系统会根据分区的大小选择默认的簇值
其实在NTFS文件系统中格式化的时候,可以在“Format”命令后面添加“/a:UnitSize”参数来指定簇的大小,UnitSize表示簇大小的值,NTFS支持512/1024/2048/4096/8192/16K/32K/64KB
在NTFS文件系统中,簇的大小会影响到磁盘文件的排列,设置适当的簇大小可以减少磁盘空间丢失和分区上碎片的数量。如果簇设置过大,会影响到磁盘存储效率;反之如果设置过小,虽然会提高利用效率,但是会产生大量磁盘碎片.
磁盘分区的最小单位是磁柱(Cylinder)
磁盘存储的最小单位是扇区(Sector)
文件系统的最小单位是区块(Block)
~~~~~~~~~~~~~~~~~~~~~
1. 硬盘物理结构现代硬盘(非固态硬盘SSD)通常由一个或多个圆形盘片组成,每个盘片都是两面存储的(还记得以前的软盘有双面双密之说),通过机械臂上的磁头进行数据读写操作。一个硬盘的参数通常称之为 3D 参数 (Disk Geometry),即柱面数(Cylinder)、磁头数(Head)和扇区数(Sector)。
磁头: 磁头固定在可移动的机械臂上,用于读写数据。现代硬盘都是双面可读写,因此磁头数量等于盘片数的 2 倍。磁头数最大值为 255 (8 个二进制位)。
磁道: 每个盘面都有 n 个同心圆组成,每个同心圆称之为一个磁道。由外向内分为 0 磁道到 n 磁道。
柱面: n 个盘面的相同磁道 (位置相同) 共同组成一个柱面。柱面数最大为 1023 (10 个二进制位)。
扇区: 从磁盘中心向外画直线,可以将磁道划分为若干个弧段。每个磁道上一个弧段被称之为一个扇区。扇区是硬盘的最小组成单元,通常是 512 字节。磁道上的扇区数最大为 63 (6 个二进制位)。
在老式硬盘中,尽管磁道周长不同,但每个磁道上的扇区数是相等的,越往圆心扇区弧段越短,但其存储密度越高。不过这种方式显然比较浪费空间,因此现代硬盘则改为等密度结构,这意味着外围磁道上的扇区数量要大于内圈的磁道,寻址方式也改为以扇区为单位的线性寻址。为了兼容老式的 3D 寻址方式,现代硬盘控制器中都有一个地址翻译器将 3D 寻址参数翻译为线性参数。
硬盘的存储容量公式:
存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
3D 寻址参数:
×× 磁道(柱面),×× 磁头,×× 扇区
我们注意到Linux的分区是按柱面来划分的。
yuhen@yuhen-desktop:~$ sudo fdisk -l /dev/sda
[sudo] password for yuhen:
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000f31e8
Device Boot Start End Blocks Id System
/dev/sda1 * 1 993 7976241 83 Linux
/dev/sda2 994 1044 409657+ 5 Extended
/dev/sda5 994 1044 409626 82 Linux swap / Solaris
- 引导区信息
硬盘的第一个扇区被称之为 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,这是判别引导区是否合法的标志。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fdisk能划分磁盘成为若干个区,同时也能为每个分区指定分区的文件系统,比如linux 、fat32、 linux 、linux swap 、fat16 以及其实类Unix类操作系统的文件系统等;然后对分区进行格式化所需要的文件系统;这样一个分区才能使用;
通过fdsik -l 查看硬盘分区详情:
Disk /dev/hda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 140 1020127+ 83 Linux
/dev/hda3 141 267 1020127+ 83 Linux
/dev/hda4 268 1044 6241252+ 5 Extended
/dev/hda5 268 332 522081 82 Linux swap / Solaris
/dev/hda6 333 1044 5719108+ 83 Linux
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sda doesn’t contain a valid partition table
======================================================================================
heads 磁盘面
sectors 扇区
cylinders 柱面
每个扇区大小是512byte(0.5K)
硬盘体积=heads*sectors*512*cylinders
硬盘分区的步骤:
主分区(包括扩展分区) 最大4个
逻辑分区 最大16个
主分区(包含扩展分区)的个数由硬盘的主引导记录MBR(Master Boot Recorder)决定,MBR存放启动管理程序和分区表记录
扩展分区也算一个主分区,用以包含更多的逻辑分区,接着从4开始
逻辑分区是从5开始
主分区有3个,从hda1-hda3,扩展分区由hda5-hda6
逻辑分区是hda5-hda6
分区前,先列出硬盘信息
~~~~~~~~~~~~~~~~~~~~
硬盘寻址方式
硬盘有两种寻址模式,一种就是C/H/S(Cylinder/Head/Sector)寻址模式,也可以称为三维地址模式,这是硬盘最早采用的寻址模式,当时硬盘的容量还非常小,人们采用与软盘类似的结构生产硬盘,也就是硬盘盘片的每一条磁道都具有相同的扇区数,由此产生了所谓的3D参数(Disk Geometry),既磁头数(Heads)、柱面数(Cylinders)、 扇区数(Sectors),以及相应的寻址方式。
在老式硬盘中,由于每个磁道的扇区数相等(与软盘一样),所以外磁道的记录密度要远低于内磁道,因此会浪费很多磁盘空间。为了解决这一问题,进一步提高硬盘容量(C/H/S寻址的容量是有限制的,后面会提到),人们改用等密度结构生产硬盘,也就是说,外圈磁道的扇区比内圈磁道多。采用这种结构后,硬盘不再具有实际的3D参数,寻址方式也改为线性寻址,即以扇区为单位进行寻址,这种寻址模式叫做LBA,全称为Logic Block Address(即扇区的逻辑块地址)。
扇区的三维物理地址与硬盘上的物理扇区一一对应,即三维物理地址可完全确定硬盘上的物理扇区。
- 1
而在LBA方式下,系统把所有的物理扇区都按照某种方式或规则看做是一个线性编号的扇区,即从0到某个最大值方式排列,并连成一条线,把LBA作为一个整体来对待,而不再是具体的实际的C/H/S值,这样只用一个序数就确定了一个惟一的物理扇区,显然线性地址是物理扇区的逻辑地址。
为了与使用C/H/S寻址的老软件兼容(如使用BIOS Int13H接口的软件)在硬盘控制器内部安装了一个地址翻译器,由它负责将C/H/S参数翻译成LBA地址。
那么LBA地址到底如何与实际的C/H/S值相对应呢?如何把C/H/S地址转换为LBA地址,把LBA地址转换成C/H/S值呢?
首先,我们来了解一下从C/H/S到LBA线性地址的转换规则。由于系统在写入数据时是按照从柱面到柱面的方式,在上一个柱面写满数据后才移动磁头到下一个柱面,并从柱面的第一个磁头的第一个扇区开始写入,从而使磁盘性能最优,所以,在对物理扇区进行线性编址时,也按照这种方式进行。即把第一柱面(0柱)第一磁头(0面)的第一扇区(1扇区)编为逻辑“0”扇区,把第一柱面(0柱)第一磁头(0面)的第二扇区(2扇区)编为逻辑“1”扇区,直至第一柱面(0柱)第一磁头(0面)的第63扇区(63扇区)编为逻辑“62”扇区,然后转到第一柱面(0柱)第二磁头(1面)的第一扇区(1扇区),接着上面编为逻辑“63”扇区,0柱面所有扇区编号完毕后转到1柱面的0磁头1扇区,依次往下进行,直至把所有的扇区都编上号。
另外还要注意C/H/S中的扇区编号从“1”至“63”,而LBA方式下扇区从“0”开始编号,所有扇区顺序进行编号。
- 1
- 2
- 3
掌握了这个关系,我们就可以列出公式来对两种寻址模式进行相互转换。
从C/H/S到LBA的转换公式:
这里规定用
C表示当前柱面号,
H表示当前磁头号,
S表示当前扇区号,
CS表示起始柱面号,HS表示起始磁头号,SS表示起始扇区号,PS表示每磁道扇区数,PH表示每柱面磁道数,所以公式为:
LBA=(C–CS)﹡PH﹡PS+(H–HS)﹡PS+(S–SS)
一般情况下,CS=0,HS=0,SS=1,PS=63,PH=255。
下面带入几个值验证一下:
当C/H/S=0/0/1时,代入公式得LBA=0
当C/H/S=0/0/63时,代入公式得LBA=62
当C/H/S=0/1/1时,代入公式得LBA=63
这里不再过多验证,请读者自己进行跟多值的验证,下面来看从LBA到C/H/S的转换关系。
首先介绍两种运算DIV和MOD(这里指对正整数的操作)。DIV称做整除运算,即被除数除以除数所得商的整数部分。比如,3 DIV 2=1,10 DIV 3=3;MOD运算则是取商的余数。比如,5 MOD 2=1,10 MOD 3=1。DIV和MOD是一对搭档,一个取整数部分,一个取余数部分。
各参数仍然按上述假设进行,则从LBA到C/H/S的转换公式为:
C=LBA DIV (PH﹡PS)+CS
H=(LBA DIV PS)MOD PH+HS
S=LBA MOD PS+SS
同样可以带入几个值进行验证:
当LBA=0时,代入公式得C/H/S=0/0/1
当LBA=62时,代入公式得C/H/S=0/0/63
当LBA=63时,代入公式得C/H/S=0/1/1
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/icesnows/archive/2010/09/13/5880074.aspx
硬盘的结构: < XMLNAMESPACE PREFIX =”O” />
硬盘的结构和软盘差不多,是由磁道 (Tracks)、扇区(Sectors)、柱面 (Cylinders)和磁头(Heads)组成的。
拿一个盘片来讲,它和软盘类似,上面被分成若干个同心圆磁道track,每个磁道track被分成若干个扇区sector,每扇区sector通常是512字节。
硬盘的磁道数track一般介于300-3000之间,每磁道的扇区数通常是63,而早期的硬盘只有17个。
磁道 、扇区、柱面cylinder
和软盘不同的是,硬盘由很多个磁片叠在一起,柱面指的就是多个磁片上具有相同编号的磁道track,它的数目和磁道是相同的。
硬盘的容量如下计算: 硬盘容量=柱面数×扇区数×每扇区字节数×磁头数 标准IDE接口最多支持1024个柱面,63个扇区,16个磁头,这个最大容量为1024×63×16×512= 528,482,304字节,即< XMLNAMESPACE PREFIX =”ST1” />528M;
fdisk -l的输出
Disk /dev/hda: 82.3 GB, 82347195904 bytes
总共的硬盘大小
255 heads, 63 sectors/track, 10011 cylinders
255个磁头, 每个磁道63个扇区,10011个柱面。