26.文件使用磁盘的代码实现

【README】

1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;

2.文件内容复习:

  • 1)如何从生磁盘抽象为文件?
    • 核心是从字符流位置算出盘块号;
  • 2)如何算出盘块号?
    • 用到顺序结构,或链式结构,或索引结构提供的字符流到盘块号的映射表。

【1】再一次使用磁盘,通过文件使用

 1) fs/read_write.c 文件读写代码

// 在 fs/read_write.c 中 
// fd : 文件描述符 
// buf: 内存缓冲区
// count: 读写字符个数  
int sys_write(int fd, const char* buf, int count) 
{struct file *file = current->file[fd]; struct m_inode *inode = file->inode; if (S_ISREG(inode->i_mode)) return file_write(inode, file, buf, count); // file_write 写文件
}

【代码说明】

  • Write 到了内核级代码就是系统调用  sys_write ;
  • Sys_write 代码没有使用盘块号,但会通过参数计算出盘块号;
  • 实际对文件的使用,对磁盘读写,就是去处理字符流中的一段;

【图解】读写磁盘细节(代码层面)

  • 步骤1:获取文件的inode,i 指的是索引,node指的是 FCB(文件控制块);其中FCB 存储了索引盘块号(即 字符流到盘块号的映射关系);
  • 步骤2:根据要操作的字符位置和索引(映射关系)计算出字符流对应的盘块号进行读写;代码表现为 file_write(inode, file, buf, count) ,其中inode是index+fcb(索引+索引块),file存储了文件字符流位置范围(如200~212),buf内存缓冲区地址,count字符个数;  

【1.1】file_write 整个工作过程

1)file_write(inode, file, buf, count) 文件写函数

  • inode: inode存储了索引盘块号(字符范围与盘块号的映射关系);
  • file: 字符起始位置 200;
  • buf: 内存缓冲区;
  • count: 字符个数12;

通过 file 和 count 就可以计算出字符范围 200~212 ;

2)磁盘读写整个过程如下(用户程序到磁盘驱动,到磁盘控制器):

  • 步骤1: 用户应用程序调用 file_write 函数写磁盘,传入 inode,file,buf,count 参数;
  • 步骤2: file中的字符起始位置200,count为12,则可以表示字符范围 200~212;
  • 步骤3: 通过索引盘块号读入索引(字符范围与盘块号的映射关系),根据字符起始位置查找索引可以找到盘块号789;
  • 步骤4: 把盘块号789添加到请求队列,由驱动程序中的中断处理程序调用电梯算法选择盘块号,并把盘块号解析出 CHS(柱面号,磁头号,扇区偏移)送入磁盘控制器;
  • 步骤5:磁盘控制器根据CHS对具体扇区进行磁盘读写;

3)file_write 的 代码实现

 【图解】file_write写文件详细步骤

  • 1)步骤1:找到要操作的文件字符位置 pos;
  • 2)步骤2:调用 create_block() 根据位置pos查找索引(inode存储了索引)得到盘块号block;
  • 3)步骤3: bread(...) 把盘块号添加到请求队列,当前线程睡眠(当磁盘读写完成,由中断处理程序唤醒当前线程);
  • 4)步骤4: 添加到请求队列后,在循环体中从磁盘读字符(每次读一个字符);

4)Create_block() 算出盘块号的代码实现

5)设备文件的inode

 【图解】

  • i_mode 指向字符文件;
  • i_zone 指向文件内容数据块;
  • MAJOR : 主设备号;
  • MINOR  : 次设备号;

【2】伟大的文件视图

【2.1】操作文件

 【图解】操作磁盘步骤

  • 步骤1:打开文件; fd = open(“test.c”) ; // 获取文件描述符 ;
  • 步骤2:读取文件; write(fd) ; fd 存在于 文件列表;
  • 步骤3:通过文件列表找到 fd 对应的inode; (以上3个步骤讲的是 通过文件名或文件路径获得inode)
  • 步骤4:通过inode找到盘块号;
  • 步骤5:把盘块号送入请求队列;
  • 步骤6:驱动程序从队列取出盘块号,计算出CHS参数并发出 out 指令把参数送入磁盘控制器;
  • 步骤7:磁盘控制器驱动马达读写磁盘扇区,电生磁磁生电

【2.2】操作显示器等其他外设

  • 其调用路径也与操作磁盘路径类似;
  • 只不过inode指向的是显示器,而不是文件盘块号;操作函数是 tty_write 而不是file_write ;

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

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

相关文章

.NET Core全新的配置管理[共9篇]

提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中。到了.NET Core的时候,很多我们…

redis存opc_KEPServerEX6完整免费版

KEPServerEX6完整免费版是一款先进的连接平台,主要用于为您的应用程序提供单一来源的工业自动化数据,通过连接、管理、监视和控制不通的自动化设备和应用程序来实现工业数据。具有严谨的技术特征,支持多达250种以上的通讯协定,可连…

Oracle入门(十四B)之PL/SQL异常处理

定义:程序执行过程的警告或错误成为例外(Exception) 一、常见预定义错误 二、非预定义错误及用户定义错误 (1)非预定义oracle错误其他标准的oracle错误,可以自定义异常名,将其与指定oracle错误关联,由系统触发。 例子…

C#读书雷达 | TW洞见

大家都知道,ThoughtWorks的技术雷达每年都会发布两到三次,它不但是业界技术趋势的标杆,更提供了一种卓有成效的方法论,即打造自己的技术雷达。在这种思想的驱动下,我们诞生了自己的读书雷达。但这份雷达略显high level…

27.目录与文件系统

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 2.第4层抽象:抽象整个磁盘到文件系统 【1】文件系统,抽象整个磁盘(第4层抽象) 【图解】整个磁盘抽象1…

dd命令打包多个文件_linux的tar命令详情;linux多个文件压缩打包到一个压缩文件...

tar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。Linux打包命令_tartar命令可以用来压缩打包单文件、多个文件、单个目录、多个目录。常用格式:单个文件压缩打包 tar czvf my.tar.gz file1多个文件压缩打包 tar czvf my.tar.gz file1 file2,...(file…

28.文件目录解析代码实现

【README】 1.本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐; 背景: 磁盘格式化后,其组成部分包括引导块,超级块,inode使用位图,盘块使用位图&#xff0…

Oracle入门(十四A)之PL/SQL 基本结构

一、条件控制语句 &#xff08;1&#xff09;条件语句Iif…then…end if形式1:if <布尔表达式> then…(pl/sql和sql)…end if;&#xff08;2&#xff09;条件语句II if…then…else … end if 形式2&#xff1a;if <布尔表达式> then…(pl/sql和sql)else…end if;…

利用记事本创建一个ASP.NET Core RC2 MVC应用

步骤一、安装最新的.NET Core SDK 我们可以根据自身的操作系统环境从https://github.com/dotnet/cli上下载.NET Core最新的SDK&#xff0c;这个SDK包含.NET Core Runtime和一些有用工具&#xff08;比如命令行&#xff09;。如果你已经安装了老旧的版本&#xff0c;我个人建议你…

datatable中某一列最小值_获取DataTable 某一列所有值

//获取某一列值string orderids (from d in dt.AsEnumerable() select d.Field("OrderID")).ToList().ListToString();/// /// 判断字符串是否在某字符串数组当中/// /// /// /// public static bool In(this string value, params string[] items){return items.An…

29.操作系统对磁盘的4层抽象小结

【README】 本文总结了操作系统 对磁盘的4层抽象&#xff0c;并给出了详细介绍的post 链接&#xff1b; 【1】对磁盘的4层抽象 【1.1】对磁盘的第1层抽象 通过盘块号读写磁盘&#xff08;读写多个扇区&#xff09;&#xff1b; 因为磁盘底层操作的单位是扇区&#xff08;51…

Oracle入门(十四C)之转换函数

一、数据转换类型 为数据库创建表时&#xff0c;SQL 程序员必须定义在表的各个字段中存储何种数据。在 SQL 中&#xff0c;有几种不同的数据类型。这些数据类型用于定义每个列中可以包含的值的范围。 &#xff08;1&#xff09;在本文中将使用以下数据类型VARCHAR2 CHAR NUMBER…

发布在即!.NET Core 1.0 RC2已准备就绪

先说点废话&#xff0c;从去年夏天就开始关注学习ASP.NET Core&#xff0c;那时候的版本还是beta5&#xff0c;断断续续不停踩坑、一路研究到11月份RC1发布。 在这个乐此不疲的过程里&#xff0c;学习了很多新的东西&#xff0c;对ASP.NET Core也是越来越喜爱。然而到现在&…

1.java IO模型(BIO,NIO,AIO)

【README】 本文介绍了 3种 java io模型&#xff0c;包括 BIO&#xff0c;NIO&#xff0c; AIO&#xff1b; IO模型名称 描述 工作原理 BIO-Blocking IO 同步并阻塞式IO 一个服务器线程处理一个客户端连接 NIO-Non-blocking IO 同步非阻塞式IO 一个服务器线程处理多个…

Oracle入门(十四D)之常规函数

一、NULL处理 &#xff08;1&#xff09;函数的计算过程 到目前为止&#xff0c;您已经学会了在简单语句中应用单行函数。不过&#xff0c;函数可以嵌套任意层。所以&#xff0c;了解嵌套函数的计算过程非常重要。下例就是一个嵌套函数。其计算过程是从最里层开始计算&#xff…

python定义函数prime判断是否是素数_用自定义函数判断素数 用C语言编写自定义函数prime(int x),判断x是否为素数?...

用C语言编写自定义函数prime(int x)&#xff0c;判断x是否为素数&#xff1f;int prime(int x){int i&#xff0c;kk(int)sqrt( (double)x )for(i2i&ltki )if(x%i0)break// 如果完成所有循环&#xff0c;那么x为素数if(i&gtk)retrun 1elsereturn 0}C语言&#xff0c;编…

构建高性能.NET应用之配置高可用IIS服务器-第一篇:IIS必须掌握的知识

正确而合理的配置IIS是构建一个高性能和高可扩展应用的基础。虽然很多的时候采用默认的配置就已经可以处理一般的情况&#xff0c;但是随着站点应用的发展&#xff0c;特别是当访问量稍微大一点的时候&#xff0c;就会暴露出很多我们认为的“奇奇怪怪”的问题。 所以&#xff0…

3.NIO选择器(基于NIO的服务器与客户端通讯)

【README】 本文总结自B站《尚硅谷netty》&#xff0c;很不错&#xff1b; 【1】选择器Selector&#xff08;多路复用器&#xff09; 【1.1】基本介绍 1&#xff09;Java 的 NIO&#xff0c;用非阻塞的 IO 方式。可以用一个线程&#xff0c;处理多个客户端连接&#xff0c;就…

perplexity 衡量指标_求通俗解释NLP里的perplexity是什么?

高赞回答讲得已经非常通俗易懂&#xff0c;不过由于自然语言处理的发展&#xff0c;出现了许多不同类型的模型&#xff0c;对困惑度这个指标的计算方法颇有不同(包括前面的高赞回答也只是展开了一个子集)&#xff0c;常常让人摸不着头脑。所以这个回答旨在尽量全面地梳理不同语…

C#在Linux上的开发指南

本人才疏学浅&#xff0c;在此记录自己用C#在Linux上开发的一点经验&#xff0c;写下这篇指南。&#xff08;给想要在Linux上开发C#程序的朋友提供建议&#xff09; 目前在Linux上跑的网站&#xff1a;http://douxiubar.com | http://douxiubar.com/AdminLogin/Index&#xff0…