从零开发操作系统-为什么磁盘的扇区为 512 byte

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

文章目录

  • 一、背景
  • 二、问题起源
  • 三、问题答案
  • 四、扩展-关于机械硬盘需要知道的知识
    • 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 code

		DB		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				; 不使用分区,必须是0
		DD		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, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd

; 信息显示部分

		DB		0x0a, 0x0a		; 换行两次
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x1fe-$			; 填写0x00直到0x001fe

		DB		0x55, 0xaa

; 启动扇区以外部分输出

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	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 个扇区。显然,簇属于操作系统运用的逻辑概念,与磁盘自身的物理属性并无关联。

从磁盘空间管理和数据读取效率的角度来看,为了实现更卓越的管理效能和更高效的数据读取,操作系统制定了严格的规则:一个簇中仅能容纳一个文件的内容。这就导致文件所占用的空间必然是簇的整数倍。即便某个文件的实际大小小于一簇,它仍然要占据一整簇的空间。因此,在通常情形下,文件所占空间会稍大于其实际大小。只有在极为特殊的情况下,即文件实际大小恰好为簇的整数倍时,文件实际大小才会与所占空间完全相符。

这种以簇作为最小分配单位的机制,虽然在一定程度上简化了硬盘数据管理流程,但也不可避免地引发了磁盘空间的浪费问题。特别是当小文件数量众多时,在一个容量达上千兆的大型硬盘中,由此导致的磁盘空间浪费量可达上百兆字节之巨。这种空间浪费现象对于磁盘空间的高效利用形成了显著挑战,在存储规划与文件管理过程中必须予以充分考量。同时,在不同的应用场景和存储需求下,应当合理抉择文件系统类型,并对簇的大小进行科学设置,以此在管理便利性与空间利用率之间达成平衡,保障系统存储资源的优化配置。

五、总结

本文是讨论有关扇区的知识和了解关于操作系统的硬盘空间管理的简短讨论。希望通过阅读这篇文章,大家能对扇区、簇等概念有更深入的了解,同时也能对操作系统如何管理硬盘空间有更清晰的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/908458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文了解Android SELinux

在Android系统中,SELinux(Security-Enhanced Linux)是一个增强的安全机制,用于对系统进行强制访问控制(Mandatory Access Control,MAC)。它限制了应用程序和进程的访问权限,提供了更…

Redis-持久化(增量模式和全量模式)

文章目录 一、持久化和Redis持久化概念持久化介绍Redis持久化的介绍全量模式持久化技术——RDB增量模式持久化技术——AOF使用RDB还是AOF? 二、RDB配置以及数据恢复的简单实现RDB快照的工作方式如何关闭RDB持久化功能如何模拟Redis服务器数据丢失?然后再如何具体使…

SQL 常用语句

目录 我的测试环境 学习文档 进入数据库 基础通关测验 语句-- 查 展示数据库; 进入某个数据库; 展示表: 展示某个表 desc 查询整个表: 查询特定列: 范围查询 等于特定值 不等于 介于 特定字符查询 Li…

MFC图形函数学习05——画椭圆函数

MFC中有一个专门绘制椭圆的函数,其参数与绘制矩形参数相同,实际上所绘制的椭圆就是矩形的内切圆椭圆。 一、绘制椭圆函数 原型:BOOL Ellipse (int x1,int y1,int x2,int y2); 参数:椭圆内切矩形的左上角&#xff08…

Spring3(代理模式 Spring1案例补充 Aop 面试题)

Spring3 代理模式概述介绍什么是代理模式?为什么要使用代理模式?有哪几种代理模式?静态代理基于接口实现的动态代理(JDK自带)基于子类的动态代理 Spring_AOP_01案例补充(添加事务管理)实现完整代码:常规实现:代理实现 …

开源模型应用落地-Qwen2.5-7B-Instruct与TGI实现推理加速

一、前言 目前,大语言模型已升级至Qwen2.5版本。无论是语言模型还是多模态模型,均在大规模多语言和多模态数据上进行预训练,并通过高质量数据进行后期微调以贴近人类偏好。在本篇学习中,将集成 Hugging Face的TGI框架实现模型推理…

Android 使用ninja加速编译的方法

ninja的简介 随着Android版本的更迭,makefile体系逐渐增多,导致make单编模块的时间越来越长,每次都需要半个小时甚至更长时间,其原因为每次make都会重新加载所有mk文件,再生成ninja编译,此完整过程十分耗时…

javaNIO核心知识.中

Channel(通道) Channel 是一个通道,它建立了与数据源(如文件、网络套接字等)之间的连接。我们可以利用它来读取和写入数据,就像打开了一条自来水管,让数据在 Channel 中自由流动。 BIO 中的流…

缓存、注解、分页

一.缓存 作用:应用查询上,内存中的块区域。 缓存查询结果,减少与数据库的交互,从而提高运行效率。 1.SqlSession 缓存 1. 又称为一级缓存,mybatis自动开启。 2. 作用范围:同一…

流畅!HTMLCSS打造网格方块加载动画

效果演示 这个动画的效果是五个方块在网格中上下移动&#xff0c;模拟了一个连续的加载过程。每个方块的动画都是独立的&#xff0c;但是它们的时间间隔和路径被设计为相互协调&#xff0c;以创建出流畅的动画效果。 HTML <div class"loadingspinner"><…

【skywalking 】More than 15,000 ‘grammar‘ tokens have been presented. 【未解决请求答案】

问题 skywalking相关版本信息 jdk&#xff1a;17skywalking&#xff1a;10.1.0apache-skywalking-java-agent&#xff1a;9.3.0ElasticSearch : 8.8.2 问题描述 More than 15,000 grammar tokens have been presented. To prevent Denial Of Service attacks, parsing has b…

docker desktop使用ubuntu18.04带图形化+运行qemu

记录一下docker desktop使用ubuntu18.04带图形化命令和使用步骤 1. 下载镜像 参考&#xff1a;【Docker教程】Docker部署Ubuntu18.04(带图形化界面) 命令&#xff1a; docker pull kasmweb/ubuntu-bionic-desktop:1.10.02. 启动镜像 命令&#xff1a; docker run -d -it …

jmeter压测工具环境搭建(Linux、Mac)

目录 java环境安装 1、anaconda安装java环境&#xff08;推荐&#xff09; 2、直接在本地环境安装java环境 yum方式安装jdk 二进制方式安装jdk jmeter环境安装 1、jmeter单机安装 启动jmeter 配置环境变量 jmeter配置中文 2、jmeter集群搭建 多台机器部署jmeter集群…

ai翻唱部分步骤

模型部署 我是用的RVC进行的训练&#xff0c;也可以使用so-vits-svc。 通过百度网盘分享的文件&#xff1a;RVC-beta 链接&#xff1a;https://pan.baidu.com/s/1c99jR2fLChoqUFqf9gLUzg 提取码&#xff1a;4090 以Nvida显卡为例&#xff0c;分别下载“RVC1006Nvidia”和…

算法笔记-Day09(字符篇)

151. 反转字符串中的单词 class Solution {public String reverseWords(String s) {int lens.length(),count0;StringBuffer tempnew StringBuffer();StringBuffer ansnew StringBuffer();for(int i0;i<len;i){if(s.charAt(i)! &&(i0 || s.charAt(i-1) )){while(i&l…

安科瑞电能质量治理产品在光伏电站的应用有效解决了光伏电站面临的功率因数过低和谐波问题-安科瑞黄安南

1. 概述 随着全球对可再生能源需求的增加&#xff0c;分布式光伏电站的建设和发展迅速。然而&#xff0c;分布式光伏电站的运行过程中面临着一系列问题&#xff0c;比如导致企业关口计量点功率因数过低、谐波污染等。这些问题不仅影响光伏电站自身的运行效率&#xff0c;还会对…

Leetcode137只出现一次的数字|| 及其拓展

简述&#xff1a; 虽然标题是这么描述的&#xff0c;但是我们不是一上来就解这道题&#xff0c;先看一下他的子题和扩展 子题&#xff1a;136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 扩展题&#xff1a; 所以我们由易到难&#xff0c;先来看第一道&#x…

leetcode 382.链表随机结点

1.题目要求: 2.题目代码: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x)…

GaussDB Ustore存储引擎解读

目录 一、数据库存储引擎 二、GaussDB Ustore存储引擎 总结 本文将介绍GaussDB中的Ustore存储引擎&#xff0c;包括Ustore的设计背景、特点介绍和适用业务场景等。 一、数据库存储引擎 数据库的存储引擎负责在内存和磁盘上存储、检索和管理数据&#xff0c;确保每个节点的…

使用 Sortable.js 库 实现 Vue3 elementPlus 的 el-table 拖拽排序

文章目录 实现效果Sortable.js介绍下载依赖添加类名导入sortablejs初始化拖拽实例拖拽完成后的处理总结 在开发过程中&#xff0c;我们经常需要处理表格数据&#xff0c;并为用户提供便捷的排序方式。特别是在需要管理长列表、分类数据或动态内容时&#xff0c;拖拽排序功能显得…