1.硬件

常见的硬件有磁盘、服务器、机柜、机房机械磁盘但

是计算机中唯一的一个机械设备磁盘

外设的特点就是外设慢容量大,价格便宜

1.1.磁盘的物理结构

磁盘的物理图:

磁盘的存储图

扇区:是磁盘存储数据的基本单位,512字节,块设备

磁盘的逻辑图:

1.2.CHS和LBA

扇区是从磁盘读出和写入信息的最小单位,通常大小为512 字节。

1.磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头

2.磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道…,靠近主轴的同心圆用于停靠磁头,不存储数据
3.柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
4.扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同
5.圆盘(platter)数:就是盘片的数量
6.磁盘容量=磁头数 x 磁道(柱面)数 x 每道扇区数 x 每扇区字节数

有了上面的理解,知道磁盘的最小单位为一个扇区(512字节)

如何定位一个扇区呢,分下面三个步骤

这个操作简称CHS
1.可以先定位磁头(header)
2.确定磁头要访问哪一个柱面(磁道)(cylinder)
3.定位一个扇区(sector)

1.磁道:

某一个盘面某一个磁道的展开:

一维数组

2.柱面:

柱面上的每个磁道,扇区个数是一样的


就是二维数组

3..整盘:

整个磁盘不就是多张二维的扇区数组表(三维数组)

所以,寻址一个扇区:先找到哪一个柱面(Cylinder),在确定柱面内哪一个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了CHS。

所以,每一个扇区都有一个下标,我们叫做LBA(Logical Block Address)地址,其实就是线性地址

CHS和LBA直接的转换:

OS只需要使用LBA就可以了 LBA地址转成CHS地址,CHS如何转换成为LBA地址。都是磁盘自己来做

1.CHS转成LBA:


磁头数*每磁道扇区数=单个柱面的扇区总数
LBA=柱面号C*单个柱面的扇区总数+磁头号H*每磁道扇区数+扇区号S-1
即:LBA=柱面号C*(磁头数*每磁道扇区数)+磁头号H*每磁道扇区数+扇区号S-1扇区号通常是从1开始的,而在LBA中,地址是从0开始的
柱面和磁道都是从0开始编号的
总柱面,磁道个数,扇区总数等信息,在磁盘内部会自动维护,上层开机的时候,会获取到这些参数。


2.LBA转成CHS:


柱面号C=LBA//(磁头数*每磁道扇区数)【就是单个柱面的扇区总数】。
磁头号H=(LBA%(磁头数*每磁道扇区数)) //每磁道扇区数
扇区号S=(LBA%每磁道扇区数)+1
"/":表示除取整
所以:从此往后,在磁盘使用者看来,根本就不关心CHS地址,而是直接使用LBA地址,磁盘内部自己转换。所以:
从现在开始,磁盘就是一个 元素为扇区 的一维数组,数组的下标就是每一个扇区的LBA地址。OS使用磁盘,就可以用一个数字访问磁盘扇区了。

2.文件系统

2.1.块

操作系统读取硬盘数据的时候,其实是不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。硬盘的每个分区是被划分为一个个的”块”。一个”块”的大小是由格式化的时候确定的,并且不可以更改,最常见的是4KB,即连续八个扇区组成一个”块”。”块”是文件存取的最小单位。

1.磁盘就是一个三维数组,我们把它看待成为一-维数组",数组下标就是LBA,每个元素都是扇午


2.每个扇区都有LBA,那么8个扇区一个块,每一个块的地址我们也能算出来。

3.知道LBA:块号=LBA/8


4.知道块号:LAB=块号*8+n.(n是块内第几个扇区)

2.2.分区

其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有一块磁盘并且将它分区成C,D,E盘。那个C,D,E就是分区。分区从实质上说就是对硬盘的一种格式化。但是Linux的设备都是以文件形式存在,那是怎么分区的呢?

2.3.inode

都知道

文件=内容+属性

所以文件的内容和属性在磁盘中也是分开存储的

所以文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息(属性信息),比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”

注意事项:

1.Linux下文件的存储是属性和内容分离存储的

2.Linux下,保存文件属性的集合叫做inode,一个文件,一个inode,inode内有一个唯一的标识符,叫做inode号

3.文件名属性并未纳入到inode数据结构内部
4.inode的大小一般是128字节或者256

3.ext2文件系统

我们想要在硬盘上储⽂件,必须先把硬盘格 式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。在 Linux 系统中,最常⻅的是 ext2 系列的⽂件系统。
ext2文件系统将整个分区划分成若干个同样大小的块组(Block Group),只要能管理一个分区就能管理所有分区,也就能管理所有磁盘文件。

3.1.Block Group内部结构

3.1.1.超级块(super Block)

存放文件系统本身的结构信息,描述整个分区的文件系统信息。

记录的信息主要有:

1.bolck和inode的总量,

2.未使用的block和inode的数量,

3.一个block和inode的大小,

4.最近一次挂载的时间,

5.最近一次写入数据的时间,

6.最近一次检验磁盘的时间等其他文件系统的相关信息。

Super Block的信息被破坏,可以说整个文件系统结构就被破坏了


超级块在每个块组的开头都有一份拷贝(第一个块组必须有,后面的块组可以没有)。为了保证文件系统在磁盘部分扇区出现物理问题的情况下还能正常工作,就必须保证文件系统的super block信息在这种情况下也能正常访问。所以一个文件系统的super block会在多个block group中进行备份,这些super block区域的数据保持一致。

3.1.2.块组描述符(GDT)

块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描述符存储一个块组 的描述信息,

1.如在这个块组中从哪里开始是inode Table,

2.从哪里开始是DataBlocks,

3.空闲的inode和数据块还有多少个等等。

块组描述符在每个块组的开头都有一份拷贝

3.1.3.块位图和inode位图

Block Bitmap中记录着Data Block中哪个数据块已经被占⽤,哪个数据块没有被占⽤

每个bit表⽰⼀个inode是否空闲可⽤

3.1.4. i节点表(Inode Table)

存放文件属性 如 文件大小,所有者,

最近修改时间等当前分组所有Inode属性的集合

inode编号以分区为单位,整体划分,不可跨分区

3.1.5 .Data Block

数据区:存放文件内容,也就是一个一个的Block。根据不同的文件类型有以下几种情况:

1.对于普通文件,文件的数据存储在数据块中。


2.对于目录,该目录下的所有文件名和目录名存储在所在目录的数据块中,除了文件名外,[s-l命令看到的其它信息保存在该文件的inode中。


3.Block 号按照分区划分,不可跨分区

3.2.inode和datablock映射

inode内部有个逻辑结构就是用来进行inode和block映射的这样文件=内容+属性,就都能找到了。

下面就是如果文件的大小太大了,就需要分级存储了

创建一个新文件主要有以下4个操作:


1.存储属性

内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。

2.存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300.500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。


3.记录分配情况
文件内容按顺序300,500.800存放。内核在inode上的磁盘分布区记录了上述块列表。


4.添加文件名到目录

3.3.文件于目录

目录也是文件,但是磁盘上没有目录的概念,只有文件属性+文件内容的概念

目录的属性不用多说,内容保存的是:文件名和Inode号的映射关系

3.4.路径的解析和缓存

路径解析:

假设此时要访问下面这个文件,都要从根目录开始,依次打开每一个目录,根据目录名,依次访问每个目录下指定的目录,直到访问到test.c。这个过程叫做Linux路径解析


路径缓存:

访问任何⽂件,如果都要从/⽬录开始进⾏路径解析,那么这种速度还是太慢了,所以Linux会缓存路径结构

Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry

注意:

1.每个⽂件其实都要有对应的dentry结构,包括普通⽂件。这样所有被打开的⽂件,就可以在内存中 形成整个树形结构

2.更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何⽂件,都在先在这 棵树下根据路径进⾏查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry 结构,缓存新路径

3.5.挂载分区

挂架分区的主要流程:

1.设备打开与初始化

  • 内核通过块设备层打开分区设备
  • 分配 ext2 文件系统专用的超级块结构(ext2_sb_info)

2.读取并验证超级块

  • 从设备 0 号块组的超级块位置(通常是分区的 1024 字节处)读取超级块数据
  • 验证超级块魔数(0xEF53)以确认是 ext2 文件系统
  • 检查文件系统状态(是否干净卸载、是否需要修复)

超级块关键字段验证:

3.块组描述符表读取

  • 读取块组描述符表(位于超级块之后)
  • 每个块组描述符记录对应块组的位图和 inode 表位置
  • 验证块组描述符的一致性

4.内存数据结构建立

  • 在内存中构建 ext2 文件系统的元数据结构:
    • 超级块缓存(struct ext2_sb_info)
    • inode 缓存(struct ext2_inode_info)
    • 块位图和 inode 位图缓存
  • 建立 VFS 层与 ext2 特定结构的映射关系

5.根 inode 获取

  • 读取根目录的 inode(通常是 2 号 inode)
  • 验证根 inode 的类型(必须是目录类型)
  • 将根 inode 与挂载点目录关联

6.挂载完成与错误处理

  • 向 VFS 注册 ext2 文件系统的操作函数集
  • 返回挂载句柄,完成文件系统树的关联
  • 若过程中发现错误(如超级块损坏),返回错误码并终止挂载

4.软硬连接

1.硬连接:

我们看到,真正找到磁盘上⽂件的并不是⽂件名,⽽是inode。其实在linux中可以让多个⽂件名对应 同⼀个inode。

2.软连接:

硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和 被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92546.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92546.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92546.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前缀函数——KMP的本质

前缀函数我个人觉得 oiwiki 上的学习顺序是很合理的,学 KMP 之前先了解前缀函数是非常便于理解的。前后缀定义 前缀 prefixprefixprefix 指的是从字符串 SSS 的首位到某个位置 iii 的一个子串,这样的子串写作 prefix(S,i)prefix(S,i)prefix(S,i)。 后缀 …

解决chrome下载crx文件被自动删除,加载未打包的扩展程序时提示“无法安装扩展程序,因为它使用了不受支持的清单版本解决方案”

解决chrome下载crx文件被自动删除 【chrome设置-隐私与安全-安全浏览】,选择 不保护 【chrome设置-下载内容】,勾选 下载前询问每个文件的保存位置 下载crx文件时,选择保存文件夹,将 .crx后缀 改为 .zip后缀,再确定。 …

嵌入式学习day23-shell命令

linux软件编程学习大纲:1.IO操作文件2.多任务编程3.网络编程4.数据库编程5.硬件设备管理学习目标:1.学习接口调用(第一层)2.软件操作流程和思想(第二层)3.软件设计思想和流程架构(第三层&#x…

GPT-5 系列深度详解:第1章-引言(目录)

1 引言2 模型数据与训练3 观察到的安全挑战与评估 3.1 从强制拒绝到安全完成 3.2 禁⽌内容 3.3 拍⻢屁 3.4 越狱 3.5 指令层级 3.6 幻觉 3.7 欺骗 3.7.1 欺骗思维链监控 3.8 图像输入 3.9 健康 3.10 多语言性能 3.1.1公平性与偏见: BBQ评估4 红队测试与外部评估…

NineData 新增支持 AWS ElastiCache 复制链路

2025 年,绝大多数企业已完成业务上云,以获取更高的弹性、可扩展性和成本效益。AWS ElastiCache 作为 AWS 提供的全托管式内存数据库服务,已成为许多企业在云上构建高并发、低延迟应用的理想选择。NineData 数据复制现已全面支持从自建 Redis …

人工智能-python-特征选择-皮尔逊相关系数

以下是关于特征选择中常用方法的表格总结,并且详细阐述了皮尔逊相关系数的原理、计算方法、步骤以及示例。 常用特征选择方法总结方法原理优点缺点使用场景过滤法(Filter Method)基于特征的统计信息(如相关性、方差等)…

LabVIEW多循环架构

​LabVIEW的多循环架构是一种常见的架构,本文Temperature Monitoring.vi 采用 LabVIEW 典型的多循环并行架构,通过功能模块化设计实现温度监测全流程,各循环独立运行又协同工作,构成完整的监测系统。1. 事件处理循环(E…

深入理解Maven BOM

一、什么是Maven BOM? 1.1 BOM的基本概念 Maven BOM(Bill of Materials,材料清单)是一种特殊的POM文件,它主要用于集中管理多个相关依赖的版本。BOM本身不包含任何实际代码,而是作为一个 版本管理的"参…

Mysql分页:高效处理海量数据的核心技术

Mysql分页:高效处理海量数据的核心技术01 引言 在Web应用、移动应用或数据分析场景中,数据库常常需要处理百万甚至千万级的数据记录。一次性加载所有数据不仅效率低下,还会消耗大量网络带宽和内存资源。数据库分页技术正是解决这一挑战的关键…

通过 Docker 运行 Prometheus 入门

Promethues 组件 prometheus serverexporteralertmanager 环境准备 Docker 拉取镜像备用 # https://hub.docker.com/r/prom/prometheus docker pull m.daocloud.io/docker.io/prom/prometheus:main# https://hub.docker.com/r/prom/node-exporter docker pull m.daocloud.io/do…

Java 8特性(一)

目录 一、Lambda表达式 1、语法格式: (1)接口名 对象名(参数类型1参数名1,....参数类型n 参数名n)->{方法体;} (2)参数类型h 参数名n:接口中抽象方法的参数项 (3)->:表示连接操作 &a…

【代码随想录|232.用栈实现队列、225.用队列实现栈、20.有效的括号、1047.删除字符串中的所有相邻重复项】

232.用栈实现队列 timutimtit232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; class MyQueue { public:stack<int> Sin;stack<int> Sout;MyQueue() {}void push(int x) {Sin.push(x);}int pop() {if (Sout.empty()) { // 出栈为空就把入栈的数导出来w…

码上爬第三题【协程+浏览器调试检测】

前言&#xff1a;图灵第三题就是对用户浏览器调试检测&#xff0c;检测鼠标右击打开控制台&#xff0c;检测键盘按键ctrlshifti&#xff0c;从浏览器设置打开开发者工具也不行&#xff0c;应该是有浏览器宽高检测的&#xff0c;所以我们保证浏览器页面宽高不变即可。你如果想右…

windows、linux应急响应入侵排查

windows入侵排查 1.1检查账号 1.查看服务器是否有弱口令&#xff0c;远程管理端口是否对公网开放 2.查看服务器是否存在可疑账号、新增账号 检查方法&#xff1a;打开 cmd 窗口&#xff0c;输入 lusrmgr.msc 命令&#xff0c;查看是否有新增/可疑的账号&#xff0c;如有管…

11. 为什么要用static关键字

11. 为什么要用static关键字 static&#xff1a;通常来说&#xff1a;在new一个对象的时候&#xff0c;数据存储空间才会被分配&#xff0c;方法才能被外界使用。但是有时只想单独分配一个存储空间&#xff0c;不考虑需要创建对象或不创建对象&#xff0c;在没有对象的情况下也…

[Oracle] MAX()和MIN()函数

MAX() 和 MIN() 是 Oracle 常用的聚合函数&#xff0c;用于从一组值中找出最大值和最小值1.MAX()函数MAX()函数返回指定列或表达式中的最大值语法格式MAX(expression)参数说明expression&#xff1a;可以是列名、计算列或表达式示例-- 返回employees表中salary列的最大值 SELEC…

网络资源模板--基于Android Studio 实现的麻雀笔记App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情&#xff08;部分) 添加页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也可以)&…

96-基于Flask的酷狗音乐数据可视化分析系统

基于Flask的酷狗音乐数据可视化分析系统 &#x1f4cb; 目录 项目概述技术栈系统架构功能特性数据库设计核心代码实现数据可视化部署指南项目总结 &#x1f3af; 项目概述 本项目是一个基于Flask框架开发的酷狗音乐数据可视化分析系统&#xff0c;旨在为用户提供音乐数据的…

Java基础-红包雨游戏-多线程

目录 案例要求&#xff1a; 实现思路&#xff1a; 代码&#xff1a; Employee RedPacket RedPacketRain 总结&#xff1a; 案例要求&#xff1a; 实现思路&#xff1a; 创建一个员工类,id和抢到的金额&#xff0c;创建一个红包类&#xff0c;里面就是金额&#xff0c;创…

[激光原理与应用-203]:光学器件 - 增益晶体 - 增益晶体的使用方法

增益晶体是激光器的核心元件&#xff0c;其作用是通过受激辐射放大光信号。正确使用增益晶体需综合考虑晶体选型、光路设计、热管理、泵浦方式及安全防护等关键环节。以下是增益晶体的详细使用方法及注意事项&#xff1a;一、晶体选型&#xff1a;根据需求匹配参数材料选择Nd:Y…