使用U盘传数据时操作系统做了什么(源码分析)(三)

2017-04-08 05:25:00
2puT
转贴
308
摘要:使用U盘传数据时操作系统做了什么(源码分析)(三)

三、过程演示

使用mount命令

我们可以看到我的linux文件系统是EXT4,而U盘的文件系统是NTFS。 
使用cp命令从U盘中复制一张图片到我的家目录下。

可以看到这个图片名叫0.png 
结果当然是家目录下多了一个文件0.png

四、源码分析

上述演示过程看起来非常简单,只是使用cp命令指定一个文件和一个目录而已。 
问题在于从我将U盘插入到传输数据再到我将U盘拔出。这期间操作系统做了哪些工作呢? 
我的linux文件系统是EXT4,U盘的文件系统是NTFS。我们知道,我们将U盘插入计算机时,U盘会进行一个注册与安装的过程,也就是挂载。我的U盘挂载在了/run/media目录下。所以我的U盘的数据都可以从此文件夹下找到。

文件系统的注册、安装、卸载

那么,注册在源码中是如何实现的?

注册

内核在编译时就确定了其支持的文件系统,这些文件系统在系统启动时就在VFS中进行了注册。注册在内核中的实现是填写一个叫做file_system_type的结构体。该结构体中定义了文件系统类型名,文件系统特征,超级块的函数指针等。而且还定义了一个用于指向下一个file_system_type结构体的指针。

该结构体在/include/linux/fs.h中被定义。 
如果需要安装的文件系统在linux中并没有注册呢?如果是内核可加载的模块,那么文件系统就会在实际安装的时候进行注册,而在卸载的时候进行注销。 
实际上,该结构体的信息并不完整,我们都知道,要挂载一个文件系统,必须要指定一个挂载点,而这里并没有指明挂载点位于哪里。这就涉及下一个步骤,安装。

安装

文件系统的安装必须指定一个安装点。该安装点位于根文件系统的任一目录下。我的U盘安装在了/run/media下。把一个文件系统安装到一个安装点要用到的主要结构为mount

该结构体在/fs的Mount.h文件中被定义。

卸载

卸载文件系统就是将该文件系统的相关结构体从链表中释放。而在此之前,必须保证VFS中的超级块不为“脏”,而且没有该文件系统中的文件正在使用。卸载的内核实现是sys_umount。内核中源码位于fs/Namespace.c中,这里就不再详细介绍了。



原文地址:mp.weixin.qq.com/s/6JDIUXq3G9PoXBO5wdqfLA

发表评论
评论通过审核后显示。
联系我们