当前课程知识点:Linux 内核分析与应用 > 第8章 文件系统 > 8.5 动手实践-编写一个文件系统(上) > Video
大家好 本节视频来给大家分享一下编写一个简单的文件系统MyFS
在之前的理论课程中 我们已经学习了虚拟文件系统
VFS相关的一些数据结构
现在就通过编写一个简单的文件系统来实际体会一下
VFS相关的一些数据结构
参考资料是高剑林老师的《Linux内核探秘》深入解析文件系统
先来看文件系统结构图
这是文件系统类型结构体file_system_type
这是每个注册的文件系统对应着相应的super_block
用于存储特定文件系统的信息
这是索引节点inode 存放具体文件的信息
这是dentry目录项
方便查找文件
这是用于挂载的mount结构体
这是老版本内核的结构图 新版本中
将vfsmount放在了mount结构体里边
编写文件系统的过程实际上就是建立这些数据结构
并添加进系统的过程
来看代码
先来看内核模块初始化函数
首先执行的是register_filesystem()函数
在内核的位置是fs文件夹下的filesystems.c 我们来看
函数的参数是struct file_system_type * 类型
也就是我们自己定义的文件系统类型
是在这里进行定义的
文件系统名称是MYFS
这是一个宏
是小写的myfs
mount函数挂载是myfs_get_sb()
sb代表super_block
kill_sb函数挂载的是kill_litter_super()函数
来进入源代码
首先会执行这个函数
来判断注册的文件系统名字中是否有“.“
如果没有继续向下执行
会执行find_filesystem()函数
进入这个函数
它会遍历已经注册的文件系统
此外 可以利用这个函数遍历系统中所有的文件系统
类似于遍历进程描述符task_struct那样
在Linux内核中 所有已经注册的文件系统都是在
在file_systems 链表中
这个函数就利用这个链表查找该文件系统是否已经注册过
已经注册过的话p不为空
如果没有注册过的话p就是NULL 因为是next域
就将fs赋值给*p
如果函数都执行正常则res的值为0
回到内核态代码 接下来执行kern_mount()函
参数还是定义的文件系统类型的地址
进入kern_mount()函数
可以看到kern_mount()其实是
kern_mount_data()的封装
进入kern_mount_data()函数
此时的参数第一个还是定义的文件系统类型
这时候有两个参数
第一个还是定义的文件系统类型 第二个是NULL
接下来会执行vfs_kern_mount()函数
第一个参数还是文件系统类型
第二个参数是标志位 代表mount操作
第三个是文件系统名称
就是在内核态代码中的name字段是MYFS 第四个是空指针
进入vfs_kern_mount()函数
接下来执行的函数嵌套比较多
容易使人眼花缭乱
这里将执行的函数截图出来
放到一起来看 就比较清晰
这里会依次执行以下函数
可以看到嵌套非常多
我们来依次来看
首先是kern_mount_data()函数
接下来是vfs_kern_mount()函数
我们来进入vfs_kern_mount()函数
会执行alloc_vfsmnt()函数来分配一个mount结构体的空间
经过一些判断之后它会执行mount_fs()函数
进入mount_fs()函数 这个函数看似非常复杂
其实主要就做一件事
它调用type的mount回调函数
具体是在这里调用
这里的回调函数是内核态代码中挂载的
myfs_get_sb()
也就是这里的myfs_get_sb()
是mount_single()函数
注意在回调函数执行完毕的时候
它会将
将根dentry的d_sb字段指向sb
来看图
实际上就是将dentry
和super_block连接起来
实际上myfs_get_sb()执行的
的是mount_single()函数 也是内核API
第四个参数是myfs_fill_super()
现在来看一下调用的内核函数mount_single()
内核中还有其他的API函数 例如mount
bdev() 是针对块设备挂载时使用的函数
此外还有mount_nodev
这里使用的是mount_single()函数 来看代码
首先它会执行sget()
来查找或者创建一个superblock结构体
之后会执行fill_super()
这个就是我们自己挂载的函数myfs_fill_super()
也就是第四个参数
是这里的函数
有三个参数 第一个参数super_block指针 第二是magic码
在代码中magic码的值是这个值
这个magic码每一个文件系统都有
在4.15的内核中 magic码存放在
include/uapi/linux
magic.h中
magic码也叫魔数 有利于文件系统的索引
来看一下4.15内核中文件系统的魔数
我们在添加的时候注意不要重复就可以了
第三个参数是
一个tree_descr结构体
它的作用是描述一些文件
如果不为空,super_block在创建的同时
就会在根目录下创建一些文件
在这里是空的
也就是不需要创建任何文件
现在来看一下simple_fill_super()的源代码
这也是内核API
这个函数第一部分
先给一些super_block对象赋值
包括对superblock的操作
simple_super_operations
接下来会调用new_inode()
来创建一个inode结构
也就是文件系统的根inode
它的标志位是S_IFDIR
也就是目录 权限是0755
还有对应的一些操作方法
请大家关注一下inode的i_op
和i_fop字段
在后面创建文件和文件夹的过程中
这两个字段非常重要
之后会执行d_make_root()函数
创建根dentry
接下来就是传递参数
这个for循环是在根目录下创建一系列文件
我们之前传递的tree_descr结构为空
所以这里的for循环不会执行
如果不为空
这里会依次执行d_alloc_name()和new_inode()
来分配相应的dentry和inode结构
我们来总结一下前面所说到的函数
从kern_mount_data()函数开始 我们依次分配了mount空间
分配了super_block的空间
之后分配了根inode和根dentry的空间
对应到数据结构图上
就是依次建立了mount
super_block 根dentry 根inode结构
包括i_op和i_fop的赋值操作
这就是将我们自己的myfs文件系统注册到系统之中的过程
也就是内核模块初始化函数中
注册文件系统的部分
本节视频就先给大家分享到这里
下一节视频将会给大家分享
如何在myfs文件系统中创建文件夹和文件
谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video