当前课程知识点:Linux 内核分析与应用 >  第8章 文件系统 >  8.6 动手实践-编写一个文件系统(中) >  Video

返回《Linux 内核分析与应用》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《Linux 内核分析与应用》慕课在线视频列表

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文件系统

本节视频就给大家分享到这里 谢谢大家

Linux 内核分析与应用课程列表:

第1章 概述

-1.1 Linux操作系统概述

--1.1 Linux 操作系统概述

-1.2 Linux内核结构以及内核模块编程

--Video

-1.3 Linux内核源码中的双链表结构

--Video

-1.4 源码分析-内核中的哈希表

--Video

-1.5 动手实践-Linux内核模块的插入和删除

--Video

-第1章 概述--章节测验

-第1章导学--引领你进入Linux内核的大门

第2章 内存寻址

-2.1 内存管理之内存寻址

--Video

-2.2 段机制

--Video

-2.3分页机制

--Video

-2.4 动手实践-把虚拟地址转换成物理地址

--Video

-第2章 内存寻址--章节测验

-第二章导学-从零打造自己的操作系统

第3章 进程管理

-3.1 进程概述

--Video

-3.2 Linux进程创建

--Video

-3.3 Linux进程调度

--Video

-3.4 动手实践-打印进程描述符task_struct中的字段

--Video

-3.5工程实践-基于内核模块的负载监控

--Video

-第3章 进程管理--章节测验

-第三章导学-进程背后琳琅满目的宝贝到哪里挖?

第4章 内存管理

-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章 中断

-5.1 中断机制概述

--Video

-5.2 中断处理机制

--Video

-5.3 中断下半部处理机制

--Video

-5.4 时钟中断机制

--Video

-5.5 动手实践-中断上半部的代码分析及应用

--Video

-5.6 动手实践-中断下半部的代码分析及应用

--Video

-第5章 中断--章节测验

第6章 系统调用

-6.1 Linux中的各种API

--Video

-6.2 系统调用机制

--Video

-6.3 动手实践-添加系统调用(系统调用日志收集系统)

--Video

-第6章 系统调用--章节测验

第7章 内核同步

-7.1 内核同步概述

--Video

-7.2 内核同步机制

--Video

-7.3 动手实践-内核多任务并发实例(上)

--Video

-7.4 动手实践-内核多任务并发实例(下)

--Video

-第7章 内核同步--章节测验

第8章 文件系统

-8.1 虚拟文件系统的引入

--Video

-8.2 虚拟文件系统的主要数据结构

--Video

-8.3 文件系统中的各种缓存

--Video

-8.4 页高速缓存机制以及读写

--Video

-8.5 动手实践-编写一个文件系统(上)

--Video

-8.6 动手实践-编写一个文件系统(中)

--Video

-8.7 动手实践-编写一个文件系统(下)

--Video

-第8章 文件系统--章节测验

第9章 设备驱动

-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

直播视频:从Linux内核学习到自主操作系统研发

-从Linux内核学习到自主操作系统研发

附录:实验代码、课件以及相关素材

-各章实验代码

-《Linux内核分析与应用》课件

-《Linux操作系统原理与应用》教材课堂视频

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。