当前课程知识点:Linux 内核分析与应用 > 第8章 文件系统 > 8.7 动手实践-编写一个文件系统(下) > Video
大家好 本节视频继续来给大家分享myfs
上一节视频
已经给大家分享了创建文件夹和文件的过程
本节视频来给大家分享一下
实现open read和write的方法
首先在open方法中
只打印一行字符 已打开文件
在read和write方法中
实现的方式有很多
这里给大家分享使用KFIFO环形缓冲区来实现
大家可以参考下张天飞老师的《奔跑吧,Linux内核》
环形缓冲区通常有一个读指针和一个写指针
读指针指向环形缓冲区可读的数据
写指针指向环形缓冲区可写的数据
通过移动读指针和写指针
来实现缓冲区的数据读取和写入
Linux也实现了KFIFO的环形缓冲区
可以在一个读线程和一个写线程并发执行的情况下
不用使用锁机制来保证环形缓冲区的数据安全
在Linux内核中
KFIFO机制的API
在include/linux目录下的
kfifo.h文件中
来看代码 首先
使用DEFINE_KFIFO
来初始化一个环形缓冲区
环形缓冲区中有64个字符类型的数据
在write操作中
使用kfifo_from_user()函数
将用户空间的数据写入环形缓冲区
actual_write变量保存成功复制数据的数量
用作返回值
在read操作中
使用kfifo_to_user()
来将读取出环形缓冲区中的数据
复制到用户空间中
这三个便是自己实现的
struct file_operation结构体
来看一下文件系统数据结构图
需要注意的是 不管是
file_operations还是inode_opreations
都是在inode结构体中的
我们再来看
inode_operations中有
lookup()函数 mkdir() rmdir()函数
而file_operations则是对文件的操作
read() write() open()
那么在初学文件系统时 就会有一个疑问
mkdir() rmdir()应该是对目录的操作
而目录的操作为什么不在dentry结构体中
实际上是因为
在linux中一切皆文件
不管是文件夹还是文件 都由dentry和inode共同描述
也就是文件夹有自己的dentry和inode结构体
文件也有自己的dentry和inode结构体
inode用来存放元数据
当它是文件夹时
则执行
inode_operations中的操作 当是文件时
则执行file_operations操作
接下来编译内核模块
来插入内核模块
可以看到已经正确插入内核模块了
接下来需要执行挂载
也就是执行mount命令
mount是进行挂载 什么叫挂载
.简单来说就是系统本身有一个从
/开始的一颗文件树
而我们自己的MYFS是一根树枝
挂载就是将这根树枝镶嵌到树上
并且以后可以从树找到这根树枝
mount命令执行后 会调用sys_mount系统调用
在源代码中简要看下这一过程
首先系统调用是SYSCALL_DEFINE5()函数
位于fs文件夹下namespace.c文件中
来看源代码
之后它会调用do_mount()函数
进入do_mount()函数
由于我们这里是第一次执行mount操作
所以调用的是这里的do_new_mount()函数
进入
在这里又可以看到之前分析过的vfs_kern_mount()函数
即用来创建根dentry和根inode结构体
之后执行do_add_mount()
把源文件系统挂载到目的文件系统
这里又执行vfs_kern_mount()函数
由于之前我们插入内核模块时已经执行了一次
所以在这里获取的就是我们刚刚执行
生成的结构体
首先进入根目录
创建一个文件夹
执行mount操作
先来打印内核消息
这里打印出了相关的一些信息
现在我们来进入我们的文件夹
可以看到已经生成了
在内核态代码中想要生成的两个文件夹
First和Second
使用ls –l命令来查看
可以看到这里的权限和我们预期是一致的
d代表目录文件
这里也生成了两个文件one two
有可写的权限
好 接下来使用用户态测试程序来测试
myfs文件系统
实际上我们可以在这里使用cat命令
来查看文件 打印内核消息
可以看到已打印出了已打开文件
等消息
证明已经执行了open和read操作
现在来执行用户态测试程序
在用户态测试程序中 依次执行
open
write和read
在这里定义read_buffer
用来保存环形缓冲区中读取出来的数据
写入和读出的数据是I am myfs
来对文件进行编译
执行
可以看到打印出的信息
I am myfs就是读取出来的数据
一共是10个字节
另外在调试代码的时候 可以多使用printk语句
这是调试代码最普遍使用的方法
在每个函数中使用一个变量
来作为错误标志
可以在每个函数首部尾部打印这个字段的值
来观察代码执行过程的正误
另外可以在proc目录下
查看现在系统当中的文件系统
也可以看到myfs
另外在kernel.org网页中
有官方的一些参考资料 在Documentation里面
我们可以看到
linux内核中的文件系统
这里的资料非常详细 大家可以进行参考
好 这就是给大家分享的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