当前课程知识点:Linux 内核分析与应用 > 第8章 文件系统 > 8.6 动手实践-编写一个文件系统(中) > Video
大家好 本节视频继续来给大家分享MYFS文件系统
上一节视频中
已经将内核初始化函数中注册文件系统的部分执行完毕
现在来看一下如何在MYFS中创建
文件夹和文件
首先来看一下代码的整体结构
整体分为两条线
一条是创建文件夹 一条是创建文件
两条线都依次执行这几个函数
先来看创建文件夹
创建文件夹首先执行的是myfs_creat_dir()函数
而创建文件执行的是myfs_creat_file()函数
先来看创建文件夹
创建文件夹先执行myfs_creat_dir()
之后会执行myfs_creat_file()函数
也就是图中的这个函数
而创建文件时
直接执行的就是myfs_creat_file()
所以myfs_creat_dir()实际上
是对myfs_creat_file()的封装
继续执行myfs_creat_dir()函数
它有两个参数
第一个参数是要创建文件夹的名字
第二个是父dentry
接下来执行myfs_creat_file()函数
第一个参数对应的是
文件夹的名字 第二个是文件夹的权限
第三个是父dentry
这里设置的是NULL 也就是在根目录下进行创建
第四个是空指针 对应的是inode中的i_private字段
最后一个是fop
特别注意在这里将fop字段赋值为NULL
也就是文件的操作
在文件夹的创建中 我们将
标志位设置为这三个
S_IFDIR代表一个目录
S_IRWXU
代表用户有读 写 执行的权限
S_IRUGO
代表用户读 用户组读 其他读
这些可以在文件夹生成以后使用ls –l命令来查看
进入这个函数
执行myfs_creat_by_name()函数
在这个函数中
首先判断是否有父目录
如果没有就赋予一个 也就是根
dentry
之后会上锁
之后会调用lookup_one_len()函数
这个函数的作用是在父目录下根据名字来查找
dentry结构
如果存在就返回指针 不存在就创建一个dentry结构
首先在这里的锁
可以试着将这些锁注释掉
然后再进行编译插入内核模块 执行
可以看一看会有什么样的结果发生
来在内核中看一下lookup_one_len()函数的源代码
首先可以看到qstr结构体
意思是quick string
简化传递参数
但更重要的作用是保存关于字符串的元数据
即长度和哈希
接下来会执行full_name_hash()
计算文件的哈希值
在最后它还会执行__lookup_hash()
利用之前生成的哈希值
来查找同名字的dentry结构
这里也可以体现出dentry的索引作用
来进入__lookup_hash()函数
它在dcache中查找名称
并可能重新验证找到的dentry
执行lookup_dcache()函数
如果缓存中没有这个dentry 就返回NULL
如果dentry为空 则执行d_alloc()
分配新的dentry结构
之后执行lookup_real()函数
在此会调用lookup()函数
查找是否有同名的dentry存在
再次查找的目的是防止有其他用户创建了
还和以前一样我们将这些函数截图出来
首先是lookup_one_len()
哈希之后会执行__lookup_hash()函数
之后首先执行lookup_dcache()
在dcache中进行查找
之后会执行lookup_real() 再次查找
会调用lookup函数
可以进入lookup_dcache()函数来看一下是在哪里进行遍历的
执行d_lookup()
d_lookup()
在这里可以看到调用了name结构体的hash
会执行这个宏
这个宏实际上是一个for循环 来进行遍历
遍历给定类型的RCU链表
RCU是Read-Copy Update
是数据同步的一种方式
主要针对的数据对象是链表
目的是提高遍历读取数据的效率 可以不加锁
同一时间可以有多个线程同时读取该链表
并且允许一个线程对链表进行修改
修改的时候就需要加锁
RCU比较适合于
需要频繁的数据读取
而相应修改数据并不多的情景
在文件系统
经常需要查找定位目录
而对目录的修改相对来说并不多
这是RCU发挥作用的最佳场景
想要了解更多RCU方面的知识 可以查看内核文档
有详细的介绍 在Documentation文件夹下 有RCU
design下有Data-Structure等一系列文件
继续回到内核态代码
这里经过选择之后
会进入myfs_mkdir()函数
之后会执行myfs_mknod()函数
首先判断inode是否存在
如果存在就退出函数 如果inode不存在
就调用myfs_get_inode()函数创建inode
之后会执行这两个函数
将dentry加入到inode的dentry链表头
进入myfs_get_inode()函数
先申请一个inode结构 使用new_inode()函数
之后来对inode相应的字段进行赋值
第一个就是文件访问的权限
就是之前我们赋的权限 第二个是uid
也就是用户id
新版本的内核使用current_fsuid()函数来获得
第三个是组id
也是使用current_fsgid()函数来获得
第四个是文件长度
第五个是文件按块计算的长度
接下来是i_atime
最后访问时间
i_mtime
最后修改的时间
,i_ctime
最后修改inode的时间
接下来进行选择
由于我们创建的是文件夹 所以进入这里
注意在这里给i_op和i_fop
赋值为simple_dir_inode_operations
和simple_dir_operations
在内核中的位置是/fs/libfs.c的217行
接下来会将文件的链接计数加1
这也是内核提供的API函数
之后会返回inode
接下来看一下创建文件的过程
创建文件的过程是图中右边的线
传入的参数一共有五个
第一个是文件名 第二个是文件权限
第三个是父dentry 第四个是空指针
第五个是相应的操作
fop字段我们赋值为myfs_file_operations
是在这里进行定义的
在这里定义了三个方法 open read和write
来看代码 先执行myfs_creat_file()
之后执行myfs_creat_by_name()函数
这里需要注意一下权限
S_IFREG代表一个文件
S_IRUGO表示用户读 用户组读 其他读
S_IWUSR代表
户有写的权限
因为在之后要实现open read和write方法
在实现write方法时 必须得保证文件是可写的
否则write方法将不可以使用
一直执行到这里时 会执行myfs_creat()函数
之后会执行myfs_mknod()函数
在switch语句中
会进入S_IFREG
只打印一行信息creat a file 之后返回
在返回到myfs_creat_file()时
这里的fop就不再是空的了
将i_fop字段赋值为fops
来实现open read和write操作
以上就是给大家分享的myfs创建文件夹和文件的整体过程
下一节视频中将给大家分享open read和write的实现
和测试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