操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

34 | 仓库管理:如何实现文件的六大基本操作?

删除文件操作
读写文件操作
关闭文件操作
打开文件操作和新建文件操作
关闭文件
读写文件
打开文件
删除文件
新建文件
判断文件是否存在
获取文件名
释放根目录文件
获取根目录文件
思考题
重点回顾
测试
串联整合
文件相关的操作
辅助操作
文件系统

该思维导图由 AI 生成,仅供参考

你好,我是 LMOS。
我们在上一节课中,已经建立了仓库,并对仓库进行了划分,就是文件系统的格式化。有了仓库就需要往里面存取东西,对于我们的仓库来说,就是存取应用程序的文件。
所以今天我们要给仓库增加一些相关的操作,这些操作主要用于新建、打开、关闭、读写文件,它们也是文件系统的标准功能,自然即使我们这个最小的文件系统,也必须要支持。
好了,话不多说,我们开始吧。这节课的配套代码,你可以从这里下载。

辅助操作

通过上一节课的学习,我们了解了文件系统格式化操作,不难发现文件系统格式化并不复杂,但是它们需要大量的辅助函数。同样的,完成文件相关的操作,我们也需要大量的辅助函数。为了让你更加清楚每个实现细节,这里我们先来实现文件操作相关的辅助函数。

操作根目录文件

根据我们文件系统的设计,不管是新建、删除、打开一个文件,首先都要找到与该文件对应的 rfsdir_t 结构。
在我们的文件系统中,一个文件的 rfsdir_t 结构就储存在根目录文件中,所以想要读取文件对应的 rfsdir_t 结构,首先就要获取和释放根目录文件。
下面我们来实现获取和释放根目录文件的函数,代码如下所示。
//获取根目录文件
void* get_rootdirfile_blk(device_t* devp)
{
void* retptr = NULL;
rfsdir_t* rtdir = get_rootdir(devp);//获取根目录文件的rfsdir_t结构
//分配4KB大小的缓冲区并清零
void* buf = new_buf(FSYS_ALCBLKSZ);
hal_memset(buf, FSYS_ALCBLKSZ, 0);
//读取根目录文件的逻辑储存块到缓冲区中
read_rfsdevblk(devp, buf, rtdir->rdr_blknr)
retptr = buf;//设置缓冲区的首地址为返回值
goto errl1;
errl:
del_buf(buf, FSYS_ALCBLKSZ);
errl1:
del_rootdir(devp, rtdir);//释放根目录文件的rfsdir_t结构
return retptr;
}
//释放根目录文件
void del_rootdirfile_blk(device_t* devp,void* blkp)
{
//因为逻辑储存块的头512字节的空间中,保存的就是fimgrhd_t结构
fimgrhd_t* fmp = (fimgrhd_t*)blkp;
//把根目录文件回写到储存设备中去,块号为fimgrhd_t结构自身所在的块号
write_rfsdevblk(devp, blkp, fmp->fmd_sfblk)
//释放缓冲区
del_buf(blkp, FSYS_ALCBLKSZ);
return;
}
上述代码中,get_rootdir 函数的作用就是读取文件系统超级块中 rfsdir_t 结构到一个缓冲区中,del_rootdir 函数则是用来释放这个缓冲区,其代码非常简单,我已经帮你写好了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了仓库管理中文件的六大基本操作,包括新建、删除、打开、读写文件等。文章首先介绍了文件操作相关的辅助函数,如获取和释放根目录文件的函数,以及获取文件名和判断文件是否存在的函数。接着详细讲解了这些辅助函数的实现细节和功能。在文件相关的操作方面,文章提到了新建、删除、打开、读写以及关闭文件等基本功能的实现。通过对这些操作的介绍,读者可以了解文件系统的基本功能和实现原理。文章还重点介绍了新建文件和删除文件的操作方法和实现细节,包括从文件路径名中提取纯文件名、分配逻辑储存块、初始化文件对应的结构等步骤。文章内容涵盖了文件系统的基本操作,为读者提供了深入了解文件管理的基础知识。文章通过代码实现了打开文件的操作流程,包括从文件路径提取文件名、获取根目录文件、分配缓存区、读取文件对应的逻辑储存块等步骤。通过详细的代码解析,读者可以深入了解文件打开操作的实现原理。文章还介绍了读取文件和写入文件的操作流程,以及关闭文件的操作,为读者提供了全面的文件管理操作指南。文章最后通过串联整合文件系统设备驱动程序,使读者能够了解文件相关操作在实际系统中的应用。文章内容丰富,通过实例代码和详细解释,读者可以全面了解文件系统的基本操作和实现原理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • neohope
    置顶
    四、文件系统使用【1、只有一级目录;2、文件管理结构+文件大小<=4K】 1、判断文件是否存在 计算得到文件名 找到根目录文件块 跳过管理结构,遍历全部rfsdir_t目录结构,如果有重名的就返回,没有就失败 2、新建文件 A、确认文件并不存在,存在就报错 B、找到根目录文件块 C、申请一个逻辑块 D、跳过管理结构,新增一个rfsdir_t目录结构,并指向新申请的逻辑块 E、在逻辑块开始建立新的fimgrhd_t文件管理结构 3、删除文件 A、找到根目录文件快 B、跳过管理结构,遍历全部rfsdir_t目录结构,如果没有就失败 C、将rfsdir_t标识为删除 D、回收逻辑块 4、打开文件 A、找到根目录文件快 B、跳过管理结构,遍历全部rfsdir_t目录结构,如果没有就失败 C、读取逻辑块,返回 5、读取文件 A、判断文件已打开 B、根据文件偏移及读取长度,返回数据 6、写入文件 A、判断文件已打开 B、数据追加到缓存中 C、缓存写入到设备中 7、关闭设备 A、判断文件已打开 B、缓存写入到设备中 C、释放缓存

    作者回复: 总结到位

    2021-08-07
    4
  • pedro
    限制1:不可持久化,不支持crash恢复,应加入磁盘块的写入,内存中有一定文件块的缓存,支持日志,防止系统崩溃,文件数据丢失。 限制2:缺少抽象层,无法支持多种格式的文件。 限制3:小量内存式文件系统,没有使用磁盘,不支持 mount 等骚操作。 等等……

    作者回复: 哈哈是的,你有能力可以写个硬盘驱动,在rfs这个驱动中,将IO包继续下发给硬盘驱动,让硬盘驱动写入到硬盘,由此,有层层驱动堆叠的IO栈就形成了

    2021-07-26
    3
  • LDxy
    好像还缺少seek操作

    作者回复: 对,没有实现

    2021-07-26
    2
  • Kinco.
    1. 不支持多种格式的文件; 2. 不支持多层目录; 3. 不支持seek操作。

    作者回复: 是的 是的

    2021-10-20
    1
  • 艾恩凝
    打卡,果然不支持多级目录,更多的是体会一下,os中的文件操作

    作者回复: 是的 支持多级 目录 代码会更加复杂

    2022-05-12
  • MONKEYG
    我想请问下,这个try_entry是谁在调用的😂😂

    作者回复: 没有这个函数啊

    2022-05-07
  • ifelse
    文件查询

    作者回复: 嗯嗯

    2022-02-22
  • kocgockohgoh王裒
    请问删除文件的时候 是不是在根目录文件产生空洞啊 新建文件总是从根目录文件末尾操作

    作者回复: 是的

    2022-01-06
  • al_培龙
    好像不支持多级目录吧

    作者回复: 对 对 对

    2021-08-03
    2
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部