设备驱动与文件系统:05 文件使用磁盘的实现

从文件使用磁盘的实现逻辑分享

我们现在讲第30讲,内容是文件使用磁盘的具体实现,也就是相关代码是如何编写的。上一节我们探讨了如何从字符流位置算出盘块号,这是文件操作磁盘的核心。而这节课,我们将深入研究实现这一核心功能的实际代码。

一、文件读写磁盘的接口与流程在这里插入图片描述

通过文件来使用磁盘,最常用的操作就是读写,以write操作为例。我们知道,write的格式需要传递三个参数:第一个是文件描述符fd,用于指定操作的文件;第二个是内存缓冲区,用于存储要写入文件的数据或读取文件数据的存储区域;第三个是读写字符的个数。从这个接口可以看出,用户在使用时接触到的是字符流相关的概念,并没有直接涉及盘块号,但在系统内部,必然会将这些字符流信息换算成盘块号,因为磁盘实际读写操作关注的是扇区,需要根据盘块号进一步算出扇区。
在这里插入图片描述

在实际操作中,write到了内核中就变成sys_write,这是系统调用的基本知识。sys_write首先要获取inodeinode本质上就是FCB(文件控制块),获取它就相当于掌握了文件的关键信息。接下来,要根据FCB以及读写的字符流位置,算出对应的盘块号,得到盘块号后,就可以进行读写操作了。

进一步跟踪代码,file_write函数在这个过程中发挥重要作用,它需要接收inodefile、内存缓冲区以及读写长度等参数。这里需要注意的是,字符流中的读写位置信息其实存储在file中。

二、字符流读写位置的确定在这里插入图片描述

file中有一个f_pos指针,它就是我们所说的读写指针。如果大家编写过较多的C程序并操作过文件,就会对文件读写指针比较熟悉,常用的fseek函数就是用来调整这个指针的。在文件刚打开时,读写指针指向第0个位置,随着不断读写,指针会向后移动,这也就形成了我们所说的字符流。

如果是追加写入,pos会被设置为inode中的i_size,也就是文件的大小,这样就相当于把写入位置放在了文件末尾;如果不是追加写入,pos则会取出上一次读写的位置,继续往后读写。这样,我们就得到了字符流中的读写位置,再结合count参数,就能确定具体的读写范围。

三、根据读写位置计算盘块号在这里插入图片描述

得到字符流中的读写位置后,接下来关键的一步就是根据读写位置找到盘块号,这是文件抽象的核心,inode在其中发挥着重要作用。计算盘块号时,需要用读写位置除以盘块的尺寸,得到对应的逻辑块号。

在Linux 0.11系统中,文件存储采用了直接块和索引块的方式。如果f_block小于7,说明是直接块,此时可以直接从inodei_block中获取对应的盘块号,因为要写入新内容,所以还需要先申请一个空闲块,并将其记录在i_block;如果f_block大于等于7且小于512,则进入一阶索引阶段,需要先将一阶索引块读进来,再从索引块中找到对应的盘块号;如果涉及更复杂的情况,还可能会有二阶索引等。

四、向磁盘发出读写请求

一旦确定了盘块号,就可以通过bread函数(如果是写操作则类似流程)进一步处理。bread函数会根据盘块号算出扇区号(由于一个盘块对应两个扇区,所以盘块号左移一位得到扇区号),然后结合内存缓冲区信息,形成一个请求,并将其放入电梯队列。放入电梯队列后,当前操作会阻塞等待,直到磁盘中断发生,从中取出请求,算出CHS(柱面号、磁头号、扇区号),再通过out指令发送到磁盘控制器,从而完成磁盘的读写操作。

在读写完成后,pos指针需要根据实际读写的字符数进行增加,以保证下次读写能够从正确的位置开始,这部分操作和计算盘块号的过程共同构成了文件读写的核心逻辑。

五、inode的双重角色与文件视图在这里插入图片描述

讲到这里,关于从文件到盘块的映射故事基本讲完了。但需要强调的是,inode除了作为从文件对应到盘块号的映射表之外,它还是文件抽象的关键。我们之前讲过文件视图,在系统中,不仅普通的数据文件是文件,设备文件同样也是文件。对于普通文件,inode中的映射表用于实现字符流位置到盘块号的映射;而对于设备文件,inode则用来存放主设备号、次设备号等信息
在这里插入图片描述

通过inode的这种设计,系统形成了统一的文件视图。无论是读写普通磁盘文件,还是操作其他设备文件,用户看到的都是一个连续的字符流,而底层复杂的映射和处理过程都由操作系统完成。这也引出了我们下一节要讲的内容——打开文件,其实质就是从文件名到inode的映射,这是整个文件系统操作的重要环节。

六、课程总结与实验任务

我们最终使用磁盘的基本流程是通过open函数获取文件描述符fd,然后使用readwrite等函数基于fd进行操作。今天我们详细讲解了在有了fd之后,如何找到读写位置,并根据inode找到盘块号来实现磁盘读写,整个过程涵盖了从文件名到inode,再到盘块号,最后到磁盘实际操作的完整链条。
在这里插入图片描述
在这里插入图片描述

最后,给大家布置一个重要的实验任务,这也是操作系统课程八个实验中的最后一个。在Linux 0.11系统中原本没有proc文件,我们需要通过实验创建类似功能,以深入体会文件视图的概念。proc文件通常用于展示进程信息,这些信息存储在内核的task_struct全局数组中。我们要做的就是将这些信息按照文件的方式提取并返回给用户,具体实现过程是当系统发现inode表示的是proc设备时,调用proc_read函数,从task_struct中取出信息存入buffer,再传递给用户端内存,同时不要忘记修改pos指针,以保证数据以统一的字符流形式呈现。再次强调,操作系统的学习离不开实践,只有动手编写代码、完成实验,才能真正掌握操作系统的原理和实现方法

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

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

相关文章

【PCIe总线】-- inbound、outbound配置

PCI、PCIe相关知识整理汇总 【PCIe总线】 -- PCI、PCIe相关实现 由之前的PCIe基础知识可知,pcie的组成有:RC(根节点)、siwtch(pcie桥)、EP(设备)。 RC和EP,以及EP和EP能…

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起: 1、根据RK809的DATASHEET,短按开机【100ms/500ms】/长按关机,长按关机。6s/8s/10s 我在网上找到的DATASHE…

AIGC 基础篇 Python基础 02

1.bool类型 书接上回,我们上次最后讲了三大数据类型,除了这三个之外,Python也有bool类型,也就是True和False。 a 2 print(a1) print(a2) 像这里,输出的内容第一个是False,因为a的值为2,而第…

华为大规模——重塑生产力

华为大模型通过以下几个方面重塑生产力: 提供强大算力支持 华为致力于构建领先的昇腾人工智能算力平台,推出高性能昇腾AI集群,支持月级长期稳定训练,可靠性业界领先。同时打造开放的昇腾计算平台,兼容主流算子、框…

iOS上传应用包错误问题 “Invalid bundle. The “UIInterfaceOrientationPortrait”“

引言 在开发 iOS 应用的整个生命周期中,打包上传到 App Store 是一个至关重要的步骤。每一次提交,Xcode 都会在后台执行一系列严格的校验流程,包括对 Info.plist 配置的检查、架构兼容性的验证、资源完整性的审查等。如果某些关键项配置不当…

【计算机组成原理】缓冲技术SPOOLing技术

缓冲技术 单缓冲区:初始:工作区满,缓冲区空 每块用时max(处理时间, 输入时间) 传送时间双缓冲区:先装1,1满才装2。初始:工作区空,1空,2满 每块用时max(处理时间, 传送时间) 输入时…

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…

web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告

本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示,同时,统计目标数量以及违停数量,生成结果评估,一并发送到前端展示。对于本文任何技术上的空缺,可在博主主页前面博客…

基于自适应虚拟谐波阬的光储VSG并网电流谐波抑制模型

“电气仔推送”获得资料(专享优惠) 模型简介 此模型完全复现于《基于自适应虚拟阻抗的光储并网系统谐波抑制策略》-程静 此并网系统模型的核心控制为虚拟同步发电机(VSG)控制,采用基于混合广义积分器的谐波信号提取…

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求&#xff…

【会员专享数据】2017-2024年我国分省的10米精度土地覆盖数据

土地覆盖数据是我们在各项研究中都非常常用的数据,之前我们分享过2017-2024年全球范围的10米精度土地覆盖数据(均可查看之前的文章获悉详情)!该数据提供瓦片形式,也就是全球的数据没有拼成一张图,很多小伙伴…

通过css实现正方体效果

效果 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* css实…

Java并发编程-理论基础

Java并发编程-理论基础 1、什么是进程&#xff1f; 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程…

Tornado WebSocket实时聊天实例

在 Python 3 Tornado 中使用 WebSocket 非常直接。你需要创建一个继承自 tornado.websocket.WebSocketHandler 的类&#xff0c;并实现它的几个关键方法。 下面是一个简单的示例&#xff0c;演示了如何创建一个 WebSocket 服务器&#xff0c;该服务器会接收客户端发送的消息&a…

模块化架构下的前端调试体系建设:WebDebugX 与多工具协同的工程实践

随着前端工程化的发展&#xff0c;越来越多的项目采用模块化架构&#xff1a;单页面应用&#xff08;SPA&#xff09;、微前端、组件化框架等。这类架构带来了良好的可维护性和复用性&#xff0c;但也带来了新的调试挑战。 本文结合我们在多个模块化项目中的真实经验&#xff…

高考:如何合理选择学科、专业以及职业

如何合理选择学科、专业以及职业 一、自我认知&#xff1a;明确自身兴趣与优势&#xff08;一&#xff09;兴趣探索&#xff08;二&#xff09;能力评估&#xff08;三&#xff09;价值观与目标 二、外部调研&#xff1a;深入了解学科、专业与职业&#xff08;一&#xff09;学…

【新品解读】一板多能,AXRF49 定义新一代 RFSoC FPGA 开发平台

“硬件系统庞杂、调试周期长” “高频模拟前端不稳定&#xff0c;影响采样精度” “接收和发射链路难以同步&#xff0c;难以扩展更多通道” “数据流量大&#xff0c;处理与存储跟不上” 这些是大部分客户在构建多通道、高频宽的射频采样链路时&#xff0c;面临的主要问题。…

实现仿中国婚博会微信小程序

主要功能&#xff1a; 1、完成底部标签导航设计、首页海报轮播效果设计和宫格导航设计&#xff0c;如图1所示 2、在首页里&#xff0c;单击全部分类宫格导航的时候&#xff0c;会进入到全部分类导航界面&#xff0c;把婚博会相关内容的导航集成到一个界面里&#xff0c;如图2…

MySQL强化关键_020_SQL 优化

目 录 一、order by 优化 1.未添加索引 2.添加索引 3.复合索引默认升序排列 4.复合索引降序排列 5.复合索引升序降序排列并用 6.总结 二、group by 优化 1.未添加索引 2.添加索引 3.添加复合索引 三、limit 优化 四、主键优化 1.主键设计原则 五、insert 优化…

湖北理元理律师事务所视角:企业债务优化的三维平衡之道

核心提示&#xff1a;债务优化的本质不是消灭债务&#xff0c;而是在法律框架内重建财务可持续性。 一、企业债务危机的典型误区 某制造企业主曾向我坦言&#xff1a;“用新贷还旧贷3年&#xff0c;债务从200万滚到500万。”这类案例暴露出企业债务处置的共性痛点&#xff1a…