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

33 | 仓库划分:文件系统的格式化操作

思考题
测试文件系统
文件系统格式化
文件系统设备驱动程序
文件系统设备驱动程序框架
文件系统设备
设备驱动程序框架
文件系统格式化操作

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

你好,我是 LMOS。
上一节课中,我们已经设计好了文件系统数据结构,相当于建好了仓库的基本结构。
今天,我将和你一起探索仓库的划分,即什么地方存放仓库的管理信息,什么地方存放进程的“劳动成果”(也就是文件),对应于文件系统就是文件系统的格式化操作。
具体我是这样安排的,我们先来实现文件系统设备驱动,接着建立文件系统超级块,然后建立根目录,最后建立文件系统的位图。下面,我们先从建立文件系统设备开始。
这节课的配套代码,你可以从这里获取。

文件系统设备

根据我们前面的设计,文件系统并不是 Cosmos 的一部分,它只是 Cosmos 下的一个设备。
既然是设备,那就要编写相应的设备驱动程序。我们首先得编写文件系统设备的驱动程序。由于前面已经写过驱动程序了,你应该对驱动程序框架已经很熟悉了。
我们先在 cosmos/drivers/ 目录下建立一个 drvrfs.c 文件,在里面写下文件系统驱动程序框架代码,如下所示。
drvstus_t rfs_entry(driver_t* drvp,uint_t val,void* p){……}
drvstus_t rfs_exit(driver_t* drvp,uint_t val,void* p){……}
drvstus_t rfs_open(device_t* devp,void* iopack){……}
drvstus_t rfs_close(device_t* devp,void* iopack){……}
drvstus_t rfs_read(device_t* devp,void* iopack){……}
drvstus_t rfs_write(device_t* devp,void* iopack){……}
drvstus_t rfs_lseek(device_t* devp,void* iopack){……}
drvstus_t rfs_ioctrl(device_t* devp,void* iopack){……}
drvstus_t rfs_dev_start(device_t* devp,void* iopack){……}
drvstus_t rfs_dev_stop(device_t* devp,void* iopack){……}
drvstus_t rfs_set_powerstus(device_t* devp,void* iopack){……}
drvstus_t rfs_enum_dev(device_t* devp,void* iopack){……}
drvstus_t rfs_flush(device_t* devp,void* iopack){……}
drvstus_t rfs_shutdown(device_t* devp,void* iopack){……}
这个框架代码我们已经写好了,是不是感觉特别熟悉?这就是我们开发驱动程序的规范操作。下面,我们来建立文件系统设备。
按照之前的设计(如果不熟悉可以回顾第 32 课),我们将使用 4MB 内存空间来模拟真实的储存设备,在建立文件系统设备的时候分配一块 4MB 大小的内存空间,这个内存空间我们用一个数据结构来描述,这个数据结构的分配内存空间的代码如下所示。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了文件系统的格式化操作,包括建立文件系统设备和系统格式化。通过详细讲解文件系统设备的驱动程序框架代码和文件系统的超级块建立过程,读者可以快速了解文件系统的建立和格式化过程。文章还介绍了建立位图的过程,通过清零储存设备中的位图块,实现了管理逻辑储存块状态的位图。整体而言,本文内容丰富,适合对文件系统格式化操作感兴趣的读者阅读。 文章还介绍了建立根目录的过程,包括分配逻辑储存块、设置超级块中的rfsdir_t结构、初始化文件管理头数据结构等步骤。此外,文章还提到了获取/释放位图块和超级块的函数实现,以及对文件系统的初始化和格式化操作进行了串联,为读者展示了完整的文件系统格式化流程。 在测试文件系统部分,作者提到了对文件系统格式化功能进行测试的重要性,并表示将在下一节课中实现文件相关的操作。整体而言,本文内容涵盖了文件系统格式化的重要步骤和相关代码实现,对于想要深入了解文件系统格式化操作的读者来说,是一篇值得阅读的文章。

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

全部留言(6)

  • 最新
  • 精选
  • neohope
    置顶
    二、文件系统初始化 1、文件系统本身是个驱动,同样需要把驱动放到全局驱动列表中 osdrvetytabl={systick_entry,rfs_entry,NULL} 2、从而,让系统启动时自动加载驱动 hal_start->init_krl->init_krldriver->rfs_entry new_device_dsc,分配内存 new_rfsdevext_mmblk,分配设备内存 krldev_add_driver,处理驱动 krlnew_device,处理设备 init_rfs->rfs_fmat,初始化文件系统 3、其中,主要逻辑是在rfs_fmat中实现的: A、create_superblk->rfssublk_t_init->rfsdir_t_init,创建超级块。其中初始化超级块时可以看到: 超级块在第0个逻辑块,位图在第1个逻辑块,根目录为空 B、create_bitmap 标记前3个逻辑块为已占用,后续逻辑块为可用 C、create_rootdir 一方面在超级块中标明,根目录在第2块 另一方面,对根目录进行初始化,写入 fimgrhd_t文件管理头,后续有文件就要在这个文件管理头后面依次增加rfsdir_t结构 三、逻辑块使用 1、申请逻辑块 A、读取超级块,从而定位到位图块 B、读取位图块 C、位图中找到第一个可用逻辑块,并设置为使用,并返回该字节对应的逻辑块号 2、归还逻辑块 A、读取超级块,从而定位到位图块 B、读取位图块 C、位图中找到对应的逻辑块,并设置为空闲

    作者回复: 是的

    2021-08-07
    5
  • 青玉白露
    当然不行,从代码上可以看出来,这三者是相互依赖的,位图需要超级块,建立根目录需要位图来获取空闲的地址,差了哪一步都不行!

    作者回复: 哈哈 正确

    2021-08-01
    3
  • 许少年
    请问老师,如果我想为apfs编写windows驱动,目前掌握了windows内核驱动开发。 我认为文件系统就是操作物理设备空间上的数据与元数据,那么接下来该如何做呢? apfs这块不是很懂。同样的问题,让windows支持ext3。

    作者回复: 你写NT文件系统过滤型驱动就行了

    2021-09-23
    1
  • pedro
    不能,位图初始化需要操作超级块,根目录初始化需要操作超级块和位图

    作者回复: 铁子6666666

    2021-07-23
    1
  • 艾恩凝
    32 33 一直带着问题去学习,我想答案会在34节出现,打卡

    作者回复: 找到答案了吗

    2022-05-11
  • ifelse
    不能,有先后顺序

    作者回复: 是的

    2022-02-22
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部