前言
文件系统是Linux系统的核心,在Linux系统中,一切皆文件。对于开发者而言,编程过程中通常用到的是文件IO。在open函数打开文件,read函数读取文件的过程底层原理如何?本文件系统系列文章主要尝试针对的是这部分内容进行深入的讲解。
文件最终是存储在磁盘上,文件的存取,最终是读写磁盘。因此,在本文章中,将主要介绍磁盘的一些基础知识。
硬盘的物理结构
硬盘结构概述
其中:
- 每个盘片有两面,两面都可以存储数据。
- 每个盘面都有一个磁头,用于存取数据。
- 所有磁头都是固定的,一起做物理移动。但是每次只有一个磁头执行存取数据的任务,选择使用哪个磁头是由系统控制的。磁头间的切换非常迅速,而磁头摆动寻道则比较慢。
- 磁头摆动,找到要读取数据所在的磁道;盘片通过转动,将数据“送到”磁头下。
磁头数、磁道、柱面、扇区
-
磁头数: 每个盘面都有一个磁头,因此
磁头数 = 盘面数
。 - 磁道: 上以盘片轴心为圆心,不同半径的同心圆称为磁道,磁道不是真正肉眼可看见的一道一道“坑”,而是被磁盘上被磁化的区域,磁道之间有一定的间隙,以免磁道之间磁介质相互影响。
- 扇区: 每个磁道被等分为若干个弧段(扇区),每个扇区可以存放512个字节的数据。扇区是磁盘驱动器向磁盘读写数据的最小单元。
- 柱面: 不同盘片半径相同的磁道组成的一个“柱面”。
CHS编号
所谓硬盘的CHS,即Cylinder(柱面)、Head(磁头)、Sector(扇区)。每个柱面、磁头、扇区都有自己的编号。
磁道编号规则
- 磁头编号: 从上到下,分别为磁头0号,磁头1号......
- 柱面编号: 最外圈的柱面编号为0,往里依次递增1,2,3.....
扇区编号规则
每个磁道都可以被分为若干个扇区,假设有18个扇区,编号依次为1,... 18。这里的1...18在一个磁道中是唯一的,但不同磁道之间会重复。因此,要确定一个扇区在硬盘(多个盘片)中的具体位置,则需要结合柱面号/磁头号/扇区号
来确定——绝对扇区编号
,或者是为整个硬盘的所有扇区分配一个唯一的编号——DOS扇区编号
(也称为相对扇区编号
或逻辑扇区编号)。
-
绝对扇区: 由
柱面号/磁头号/扇区号
唯一确定。 - DOS(Disk Operating System)扇区(逻辑扇区): 磁盘操作系统为了管理方便,会将柱面号/磁头号/扇区号确定的扇区编号转换为易于管理和计算的单一数字编号,称为相对扇区编号或逻辑扇区编号。DOS扇区编号是从柱面0/磁头0/扇区1开始的,编号为0,依次递增,即柱面0/磁头0/扇区18的DOS扇区编号为18;柱面0/磁头1/扇区1的DOS扇区编号为19...。每个分区的第一个扇区的逻辑扇区编号为0。
通过CHS计算硬盘容量
硬盘存储容量=磁头数×柱面数×每个磁道扇区数×每个扇区字节数
磁盘存储划分
第一个扇区存储的数据
硬盘的第一个扇区(逻辑编号为0)可以说是整个硬盘最重要扇区了,它主要存储两大信息:
- 主引导分区(Master Boot Record,MBR): 存放引导加载程序,大小为446字节。
- 分区表(partition table): 记录整块硬盘分区的状态,占64字节。
硬盘分区
分区的最小单位为柱面(Cylinder)
,也就是说,分区其实就是指定从第几个柱面到第几个柱面属于哪个区。
假设硬盘有400个柱面,平均分为4个区(C、D、E、F盘),则第四个分区F的柱面范围是第301号到第400号柱面。
分区表中,记录的就是就是每个分区的起始柱面号和结束柱面号。因为分区表只有64字节,因此最多只能容纳4个分区的记录(硬盘默认),要想分更多的去,则需要通过扩展分区来创建逻辑分区
。
开机流程
- 加载BIOS: BIOS(Base Input Output System,基本输入输出系统,读做/'baious/)是硬件厂商写入到主板ROM里的一个程序,电脑开机时,会最先执行BIOS。开机后,进入BIOS界面,如下:
-
MBR: BIOS在执行的过程中,会根据用户设置(即在BIOS的Boot界面选择的优先启动项,U盘/硬盘/光驱),如果硬盘的优先级最高,则计算机会从硬盘的第一个扇区的MBR中的读取
引导加载程序(Boot Loader)
。和BIOS一样,主引导分区MBR是硬件本身会支持的东西。 -
引导加载程序:
引导加载程序(Boot Loader)
是用于读取操作系统内核文件的一个小软件,不同的操作系统有各自的引导加载程序。每个分区都可以有自己的文件系统,有自己的引导扇区
,在启动的过程中,用户可以选择是直接加载引导程序所在分区的操作系统,还是将引导加载功能交给各分区引导扇区中的加载程序。boot loader的功能主要有:- 提供菜单:让用户选择不同的开机选项,是多重引导的重要功能。
- 载入内核文件:直接指向可开机的程序区段,开始操作系统。
- 转交其他loader: 将引导加载功能转交给其他loader负责。
- 操作系统内核文件:最后,引导加载程序加载操作系统的内核文件,启动操作系统!
要点
- 每个分区都有自己的引导扇区(boot sector)。
- 实际可开机的操作系统内核文件是存放在各个分区内的,如在C盘安装Windows系统,在D盘安装Linux操作系统。
- 引导加载程序(boot loader)只会认识自己所在分区内的可开机内核文件,以及其他boot loader(相当于一个指针,指向其他loader)。
- loader可以直接指向或者间接地讲管理权交给其他loader。
- 一点经验:如果要安装多系统,最好先安装Windows,后安装Linux。因为Windows会强制覆盖MBS,也就是说,如果你先装Linux再装Windows,MBR中就只有Windows的相关选项(Linux的被覆盖掉了)。而Linux则不会强制覆盖MBR,你可以选择将Linux的引导程序安装在MBR或者其所在分区的引导扇区中;你也可以在Linux的引导程序中设置Windows的开机选项。
磁盘存储数据的形式
磁盘以二进制
的形式存储数据。我们平时编程过程中读写文件模式可能有文本形式/二进制形式,文件也有文本文件、音频文件、图片文件...等各种不同类型的文件,但这些文件在磁盘上都是以二进制的方式存储。
可以想像一下,二进制中的0,对应磁盘上的一个“凹”点,1对应磁盘上的一个“凸”点。(只是形象比喻,不是真的凹凸)。
总结
至此,硬盘(机械硬盘)的基本结构和一些核心的概念已了解的差不多了,也了解了开机过程中需要用到硬盘的地方。文件的存取,最终会落在硬盘的读写上。在后面的文章中,将逐渐自底向上介绍架构在磁盘之上的Linux操作系统的文件系统的一些理论性知识。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。