以前对于硬盘一直没有一个完整的概念,这次为了理解内核引导,特查找资料简述。
硬盘基本概念
在这里,我们不考虑硬盘的机械结构,而只考虑一些我们(程序员)可能需要了解的硬盘结构单元。我们先来看一个比较形象的硬盘模型:
(图片来源:https://technet.microsoft.com/en-us/library/dd758814(v=sql.100).aspx)
这个模型已经涉及到 2 个概念:
盘片(Platter)
:每个盘片上下两面都可存储数据,而且上下两面各需一个读/写磁头。盘片从上到下编号为 0(第 1 个盘片上)、1(第 1 个盘片下)、2(第 2 个盘片上)、3(第 2 个盘片下)…磁道(Track)
:沿着半径方向划分的同心圆(注意是有一定宽度的)。磁道从盘片外圈往内圈编号 0 磁道,1 磁道…靠近主轴的同心圆用于停靠磁头,不存储数据;
我们再来看一个图:
图片来源
这下我们再来介绍 3 个概念:
扇面
:盘片上的扇形区域。扇区(Sector)
:每个磁道被扇面切割成的区域,是数据读/写的最小单元。- 每个扇区可存储 128×2 的 N 次方(N=0.1.2.3)个字节的数据(一般为 512B)。从上图可知,外圈的扇区面积比内圈大,但存储的数据量相同,这是因为内外圈使用的磁物质密度不同。现在的硬盘已经采用内外圈同密度物质来存储数据,以减少类似“大面积小数据”的浪费情况。
- 扇区的编号从 0 磁道开始,起始扇区为 1 扇区,其后为 2 扇区、3 扇区……,0 磁道的扇区编号结束后,1 磁道的起始扇区累计编号,直到最后一个磁道的最后一个扇区。例如,某个硬盘有 1024 个磁道,每个磁道划分为63 个扇区,则 0 磁道的扇区号为 1~63,1 磁道的起始扇区号为64,最后一个磁道的最后一个扇区号为 64512。
簇(Cluster)
:同一磁道上的连续的扇区形成的区域。
我们再来看最后一张图:
图片来源
注:上图中的 Disk block 指的就是扇区。
这下我们再来介绍 1 个概念:
柱面(Cylinder)
:不同盘片上的同半径磁道组成了柱面。
通过以上各图,我们可以算出一个硬盘的容量为:磁头数 × 磁道(柱面)数 × 每个磁道扇区数 × 每扇区字节数
。
硬盘逻辑设备号
老式设备号命名规则
老式的设备号命名规则为:设备号 = 主设备号 * 256 + 次设备号
其中,主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。
在老式设备号命名规则中,常见设备的主设备号分别为:
1 | 1-内存 |
对于硬盘而言,1 个硬盘最多有 4 个分区,由次设备号来指定具体分区。按老式设备号命名规则,硬盘逻辑设备号如下:
我们也可以通过实际运行 Linux 0.11 操作系统来验证:
现代设备号命名规则
这部分主要参考自博文磁盘分区基础和 Linux 上硬盘分区设备号解释。
分区概念
主分区
:一块物理硬盘上可以被独立使用的一部分,一个硬盘最多可以有 4 个主分区。扩展分区
:为了突破一个物理硬盘只能有 4 个分区的限制,引入了扩展分区。扩展分区和主分区的地位相当,但是扩展分区本身不能被直接使用,然而可以被继续划分成多个"逻辑分区"。一个硬盘只能有一个扩展分区。
逻辑分区
:逻辑分区可以有任意多个,但是不能独立存在,多个连续的逻辑分区可作为一个扩展分区。
总结:也就是说,在一个物理硬盘上主分区和扩展分区加在一起最多仍然只有 4 个。但是扩展分区可以继续被划分成逻辑分区,而对多数用户而言,其实主分区和逻辑分区在使用上是没什么区别的。这样就达到了一快硬盘几乎可以有无限个分区的目的。
实例分析
假设现在电脑上有一个 SATA 硬盘,这时查看设备:
1 | $ ls /dev |
会发现有一个 sda(如果是 IDE 硬盘,就是 hda)。不同分区方案能看到不同结果:
分区方案一: 4 个主分区
这时候能看到:sda, sda1, sda2, sda3, dsa4
分区方案二:一个主分区和一个逻辑分区
这时候能看到:sda, sda1, sda2, sda5
这里sda是物理硬盘,sda1 是主分区,sda2 是扩展分区,sda5 是逻辑分区(正是因为必须保留 4 个数字给主分区和扩展分区使用,所以逻辑分区的数字必须从 5 开始
)。
分区方案三:一个逻辑分区
这里能看到:sda,sda1,sda5
如果有多块物理硬盘就会出现 sdb,sdc。
一个实例如下:
硬盘基本参数表
在计算机 BIOS 设定的中断向量表中,int 0x41 的中断向量位置(4*0x41=0x0000:0x0104)存放的并不是中断服务程序的地址,而是第一个硬盘的基本参数列表。第二个硬盘的基本参数列表入口地址存放于 int 0x46 中断向量位置处(4*0x46=0x0000:0x0118)。硬盘参数表内容如下表所示:
图片来源:《Linux 内核完全注释》
详细请参考博文 Linux 内核学习笔记:内核引导程序之“setup.s”“加载机器系统数据”部分。
硬盘分区表
如果 PC 机从硬盘上启动操作系统,那么 ROM BIOS 程序在执行完机器自检诊断程序后就会把硬盘上的第 1 个扇区读入内存 0x7C00 开始处,并把控制权交给这个扇区中的代码去执行。这个特定的扇区称为主引导区 MBR
(Master Boot Record),其结构如下表所示:
图片来源:《Linux 内核完全注释》
除了 446 字节的引导执行代码之外,MBR 中还包含一张硬盘分区表,共含有 4 个表项。分区表存放在硬盘的 0 柱面 0 头第 1 个扇区的 0x1BE0x1FD 偏移位置处。为了实现多个操作系统共享硬盘资源,硬盘可以从逻辑上把所有扇区分成 14 个分区。每个分区之间的扇区号是邻接的。分区表中每个表项由 16 字节,用来描述一个分区的特性。分区表项
结构如下图所示:
图片来源:《Linux 内核完全注释》