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

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

Video在线视频

Video

下一节:Video

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

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文件系统中创建文件夹和文件

谢谢大家

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笔记与讨论

也许你还感兴趣的课程:

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