从零开发操作系统-为什么磁盘的扇区为 512 byte
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:
- 了解大厂经验
- 拥有和大厂相匹配的技术等
希望看什么,评论或者私信告诉我!
文章目录
- 一、背景
- 二、问题起源
- 三、问题答案
- 四、扩展-关于机械硬盘需要知道的知识
- 4.1 扇区的基本介绍
- 4.2 物理扇区和逻辑扇区
- 4.3 块/簇
- 4.4 linux 和 window系统
- 4.4.1 linux 系统
- 4.4.2 window 系统
- 五、总结
一、背景
其实也没有啥背景。
最主要的原因就像 《30天自制操作系统》一书作者说的那样,写一个操作系统,仅仅想想就是一件特别有趣的事情呢。一两年前曾经入手开始写过,但慢慢的就不了了之了。现在又有这个想法了,准备一直干下去,最终写一个操作系统出来,算是程序员生涯的一份礼物。
其次的原因,是因为我也认为未来初级程序员的岗位会越来越少,借助 LLM 人人都是初级程序员可能会变成现实。这个时候专业性和底层就会越来越重要
二、问题起源
《30天自制操作系统》这本书的第一天有这样的一段汇编代码,其中有关系扇区大小的描述,完整的 code 如下:
; hello-os
; TAB=4; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy codeDB 0xeb, 0x4e, 0x90; 引导扇区的一部分,通常代表一种引导加载程序的开头。这三个字符通常出现在引导扇区开头,作为引导程序的启动信号。整个引导扇区的结构通常包含引导代码、文件系统信息和卷信息。这些字节的组合是为了确保计算机在启动时能够正确找到并执行引导程序DB "HELLOIPL" ; 启动扇区名称(8字节)DW 512 ; 每个扇区(sector)大小(必须512字节)DB 1 ; 簇(cluster)大小(必须为1个扇区)DW 1 ; FAT起始位置(一般为第一个扇区)DB 2 ; FAT个数(必须为2)DW 224 ; 根目录大小(一般为224项)DW 2880 ; 该磁盘大小(必须为2880扇区1440*1024/512)DB 0xf0 ; 磁盘类型(必须为0xf0)DW 9 ; FAT的长度(必须是9扇区)DW 18 ; 一个磁道(track)有几个扇区(必须为18)DW 2 ; 磁头数(必须是2)DD 0 ; 不使用分区,必须是0DD 2880 ; 重写一次磁盘大小DB 0,0,0x29 ; 意义不明(固定)DD 0xffffffff ; (可能是)卷标号码DB "HELLO-OS " ; 磁盘的名称(必须为11字节,不足填空格)DB "FAT12 " ; 磁盘格式名称(必须是8字节,不足填空格)RESB 18 ; 先空出18字节; 程序主体DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7cDB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8aDB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xebDB 0xee, 0xf4, 0xeb, 0xfd; 信息显示部分DB 0x0a, 0x0a ; 换行两次DB "hello, world"DB 0x0a ; 换行DB 0RESB 0x1fe-$ ; 填写0x00直到0x001feDB 0x55, 0xaa; 启动扇区以外部分输出DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 4600DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00RESB 1469432
上述代码要求,每个扇区(sector)大小(必须512字节)以及 簇(cluster)大小(必须为1个扇区)。所以对扇区有了很多好奇。
三、问题答案
为什么之前的扇区大小为512字节呢?这是1956年由industry trade organization, International Disk Drive Equipment和Materials Association三家机构确定的行业标准【网上都是这么说的,也没有找到特别官方的依据,但可以肯定的是必然有行业标准】。
在早期的硬盘驱动器中,扇区大小被设定为512字节,这是因为当时计算机系统的内存和处理能力有限,因为磁盘技术发展初期,存储容量非常小。
四、扩展-关于机械硬盘需要知道的知识
机械硬盘HDD,目前基本上已经淘汰,都在用 SSD( 固态硬盘 ),但因为历史原因,SSD 必然要兼容 HDD,所以HDD有的概念,机械硬盘逻辑上都会有,比如扇区等
4.1 扇区的基本介绍
A:Track 磁盘磁道(粉红色部分)
B:Geometrical sector 几何学中的扇形(紫色部分)
C:Track sector 磁盘扇区(玫红色部分)
D:Cluster 块/簇(绿色部分)
在计算机磁盘存储中,扇区是磁盘或光盘上磁道的细分。每个扇区存储固定数量的用户可访问数据,传统上,硬盘(HDD)上的扇区大小为512字节,CD-ROM和DVD-ROM的扇区大小为2048字节。较新的硬盘(HDD)使用4096字节(4 KiB)扇区,这些扇区称为高级格式(AF)。
4.2 物理扇区和逻辑扇区
在探讨物理扇区与逻辑扇区时,必然要涉及扇区大小这一要素。近年来,随着硬盘容量需求的持续增长,为提高数据记录密度,硬盘制造商通常会采用增大扇区大小的方法,进而出现了扇区大小为 4096 字节的硬盘,此类扇区被定义为“物理扇区”。
然而,应当注意的是,这种大扇区存在兼容性问题,部分系统或软件无法与之适配。为妥善解决这一问题,硬盘内部在逻辑层面将物理扇区划分为多个扇区片段,并将这些片段作为普通扇区(通常大小为 512 字节)呈现给操作系统及应用软件,这些扇区片段即被称为“逻辑扇区”。在实际的读写操作中,由硬盘内的程序(固件)负责在逻辑扇区与物理扇区之间进行转换,上层程序无法感知物理扇区的存在。
逻辑扇区是硬盘接收读写指令的最小操作单元,是操作系统及应用程序可访问的扇区,多数情况下其大小为 512 字节。通常而言,我们提及的扇区一般是指逻辑扇区。物理扇区是硬盘在底层硬件意义上的扇区,是实际执行读写操作的最小单元,仅能由硬盘直接访问,操作系统及应用程序通常无法直接对其进行访问。一个物理扇区可包含一个或多个逻辑扇区(例如,多数硬盘的物理扇区包含 8 个逻辑扇区)。当需要读写某个逻辑扇区时,硬盘底层在实际操作中会对该逻辑扇区所在的整个物理扇区进行读写。
以上阐述的是 Windows 系统中的物理扇区和逻辑扇区相关内容。此前在介绍机械硬盘时曾提到,由于历史原因,在操作系统等软件中,512KB 扇区的概念已深入人心。新的机械硬盘虽已将物理扇区大小设为 4KB,但为实现与老系统的兼容,必须引入逻辑扇区这一概念。在固态硬盘领域亦是如此,尽管其每个物理页大小在 2K 至 16K 之间不等,但出于兼容性考虑,也必须设定逻辑扇区。
4.3 块/簇
块(Block)/簇(Cluster)是逻辑层面的概念,确切地说,是一种虚拟构造的概念,二者分别与 Linux 和 Windows 操作系统中的相应概念相对应。值得注意的是,部分文献资料将其称作磁盘块/磁盘簇,在此处,我们统一以块(Block)/簇来命名。
在 Unix 和 Linux 系统中,块(Block)是操作系统中逻辑存储的最小单元。从操作系统与磁盘交互的角度来看,块(Block)是其交互操作的最小单位。
在 Windows 系统下的 NTFS 等文件系统中,相应概念为簇。每个簇可包含 2、4、8、16、32、64……2 的 n 次方个扇区。这种扇区数量的设定体现了文件系统在存储管理上的灵活性和多样性,是根据不同的设计需求和优化目标而确定的,对于理解文件系统的存储结构和数据组织方式具有重要意义。
如下所示,Windows下C 盘的Cluster的大小为4Kb大小,如下所示:
块(Block)/簇(Cluster)的存在:
1. 读取方便:由于扇区的Size比较小,数目众多时寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作。
2. 分离对底层的依赖:操作系统忽略对底层物理存储结构的设计。通过虚拟出来磁盘块的概念,在系统中认为块是最小的单位。
4.4 linux 和 window系统
4.4.1 linux 系统
在 Linux 系统的语境下,块(Block),即逻辑块,是文件系统层级的关键概念。文件系统在数据读取过程中,不会以扇区为单位逐个进行,原因在于这种方式效率极其低下。而且,扇区尺寸较小,当扇区数量众多时,寻址操作会面临相当大的困难。
基于此,文件系统是以块为单位来读取数据的。确切地说,块(Block)构成了文件系统存取数据的最小单元,其常规大小为 4KB(值得注意的是,此值在格式化分区阶段可按需修改)。
从硬件操作层面来看,读取一个块,意味着从硬件设备读取一个或多个扇区。在存储规则上,一个块仅能容纳一个文件的内容,无论该文件大小如何。一个文件可能占用一个或多个块,并且每读取一个块,就会产生一次磁盘 I/O 操作。若要对磁盘 I/O 性能进行优化,理想的策略是在一次 I/O 操作中尽可能读取更多的数据。然而,块的大小并非越大越好,需要依据具体业务场景进行合理设置。
不妨设想这样一种情况,若块的大小设定为 8KB,而系统中存在大量仅为 1KB 大小的小文件。由于一个块只能存放一个文件的内容,这种情况必然会导致严重的空间浪费。在这种情形下,若大量小文件并存,不仅会造成存储空间的低效利用,增加磁盘空间的消耗,还可能对文件系统的整体性能产生负面影响。例如,在读取小文件时,由于需要加载整个较大的块,响应时间可能会延长。因此,在确定块大小的过程中,需要全面综合考虑系统内文件的大小分布、访问模式以及存储设备的特性等多方面因素,从而实现性能和空间利用率的最优平衡。
4.4.2 window 系统
在 Windows 系统的范畴内,磁盘簇具有特殊意义。扇区作为磁盘最小的物理存储单元,因其数量巨大,操作系统无法对其进行有效寻址。于是,操作系统通过将相邻扇区组合的方式形成簇,并以此为对象开展管理工作。每个簇可包含 2、4、8、16、32 或 64 个扇区。显然,簇属于操作系统运用的逻辑概念,与磁盘自身的物理属性并无关联。
从磁盘空间管理和数据读取效率的角度来看,为了实现更卓越的管理效能和更高效的数据读取,操作系统制定了严格的规则:一个簇中仅能容纳一个文件的内容。这就导致文件所占用的空间必然是簇的整数倍。即便某个文件的实际大小小于一簇,它仍然要占据一整簇的空间。因此,在通常情形下,文件所占空间会稍大于其实际大小。只有在极为特殊的情况下,即文件实际大小恰好为簇的整数倍时,文件实际大小才会与所占空间完全相符。
这种以簇作为最小分配单位的机制,虽然在一定程度上简化了硬盘数据管理流程,但也不可避免地引发了磁盘空间的浪费问题。特别是当小文件数量众多时,在一个容量达上千兆的大型硬盘中,由此导致的磁盘空间浪费量可达上百兆字节之巨。这种空间浪费现象对于磁盘空间的高效利用形成了显著挑战,在存储规划与文件管理过程中必须予以充分考量。同时,在不同的应用场景和存储需求下,应当合理抉择文件系统类型,并对簇的大小进行科学设置,以此在管理便利性与空间利用率之间达成平衡,保障系统存储资源的优化配置。
五、总结
本文是讨论有关扇区的知识和了解关于操作系统的硬盘空间管理的简短讨论。希望通过阅读这篇文章,大家能对扇区、簇等概念有更深入的了解,同时也能对操作系统如何管理硬盘空间有更清晰的认识。