在没有分析阅读linux vfs mount代码的时候,我的想法是修改dentry所指向的inode索引节点,以此实现mount文件系统的访问。...Linux VFS的mount过程基本原理如下图所示: ? ...Linux内核维护了一个全局superblock对象链表。s_root是superblock对象所维护的dentry目录项,该目录项是该文件系统的根目录。...关键数据结构说明 Linux VFS mount所涉及的关键数据结构分析如下。...代码分析基于Linux-3.2版本。
这个 wiki 上列出了很多 Linux 的文件系统类型。...对于这些文件系统,Linux 做了一层抽象就是 VFS 虚拟文件系统,这个其实就是软件设计必然的过程,对于不同的实现规定统一的接口,也就是定义与实现分离,如果想要自己实现一个文件系统的话只要实现一个满足...对于文件系统来说挂载点是个很有意思的点,在内核当中挂载点用vfsmount表示,挂载点是文件系统之间的衔接部分,如果要添加一个新的文件系统势必要将文件系统挂载在某个目录下面使得文件系统生效,vfsmount...vfsmount的主要内容是vfsmount的拓扑关系以及指向的目录和super_block。所以从宏观的角度来说,整个文件系统的组织是如图这样的。 ?...dentry 和 inode 的关系是多对一的,即多个 dentry 可以指向同一个文件,这和 linux 当中的文件链接有关。
的dentry>) //include/linux/path.h 描述一个路径 struct path { struct vfsmount *mnt; struct...->文件系统挂载场景中,使用它查找合适的vfsmount实例作为父vfsmount。...->路径名查找场景中,使用它查找一个合适的vfsmount实例作为下一级路径名解析起点的vfsmount。...总结 Linux中,块设备上的文件系统只有挂载到内存的目录树中的一个目录下,用户进程才能访问,而挂载是创建数据结构关联块设备上的文件系统和挂载点,使得路径名查找的时候能够通过挂载点目录访问到挂载在其下的文件系统...参考文档: 《存储技术原理分析 基于Linux2.6内核源代码》
尽管内核是linux的核心,但文件却是用户与操作系统交互所采用的主要工具。这对linux来说尤其如此,这是因为在UNIX传统中,它使用文件I/O机制管理硬件设备和数据文件。...基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统会将系统根目录从rootfs切换到磁盘文件系统。...[1*]处设置了根目录的名字为“/”; [2*]处设置了vfsmount中的root目录; [3*]处设置了vfsmount中的超级块; [4*]处设置了vfsmount中的文件挂载点,指向了自己...; [5*]处设置了vfsmount中的父文件系统的vfsmount为自己; 5 根文件系统各个常用目录简介 正常来说,根文件系统至少包括以下目录: /etc/:存储重要的配置文件。.../dev目录 该目录下存放的是设备文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。
linux中有一个让很多初学者都不是特别清楚的概念,叫做“根文件系统”。我接触linux前前后后也好几年了,但是对这个问题,至今也不是特别的清楚,至少没法给出一个很全面很到位的解释。...这里有一句话,我觉得非常精辟而且到位的点出了文件系统在linux中的重要性: 尽管内核是linux的核心,但文件却是用户与操作系统交互所采用的主要工具。...基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统会将系统根目录从rootfs切换到磁盘文件系统。...[1*]处设置了根目录的名字为“/”; [2*]处设置了vfsmount中的root目录; [3*]处设置了vfsmount中的超级块; [4*]处设置了vfsmount中的文件挂载点,指向了自己...; [5*]处设置了vfsmount中的父文件系统的vfsmount为自己; 五、根文件系统各个常用目录简介 正常来说,根文件系统至少包括以下目录: /etc/:存储重要的配置文件。
在之前的一篇博文>中,我介绍了一种查找内核内存泄露的一种方法。...++++++++++++++++++++++++++++ sock_inode_cache在内核中存储socket的内核结构,而dentry则对应文件或者目录在内核中的数据结构,如果你和我一样,对Linux...根本原因 程序执行流程如下: (1) 根据文件fd,获取file对象,从file对象中获取path对象,并使用path指针pPath记录path对象地址(path对象中包扩了dentry和vfsmount...(2)程序中需对dentry和vfsmount进行访问,于是采用path_get(pPath)对引用计数加一 (3)调用系统中的原始的close,来关闭文件 (4)进行一系列的操作后,采用path_put...(pPath)对dentry和vfsmount引用计数减一 问题就出在第(3)步和第(4)步上:如果只有一个进程对文件打开并进行了访问,然后关闭文件,则进入我们产品的Hook函数,当进入第三步的时候,调用系统原始的
先看do_kernel_mount 1079 struct vfsmount *1080 do_kern_mount(const char *fstype, int flags, const char ...*name, void*data)1081 {1082 struct file_system_type *type = get_fs_type(fstype);1083 struct vfsmount ...fs_type,例如vfs_kern_mount里面传递进去的type,就是ext4_fs_type了, 进入到vfs_kern_mount里面看一下,里面肯定会调到get_sb, 899 struct vfsmount...vfs_kern_mount(struct file_system_type *type, int flags, constchar *name, void *data) 901 { 902 struct vfsmount...ext4_get_sb(struct file_system_type *fs_type, int flags,4233 const char *dev_name, void *data, struct vfsmount
一、ramdisk的制作 out/host/linux-x86/bin/mkbootfs out/target/product//root | out/host/linux-x86/bin/minigzip...\n", fdt_strerror(err)); return err; } /*往dtb中添加一个"linux,initrd-end"属性,内核通过解析dtb,结合"linux,initrd-start...(&ramfs_backing_dev_info); return err; } 挂载rootfs static void __init init_mount_tree(void) { struct vfsmount...root.dentry = mnt->mnt_root; set_fs_pwd(current->fs, &root); set_fs_root(current->fs, &root); } struct vfsmount...); list_add_tail(&mnt->mnt_instance, &root->d_sb->s_mounts); br_write_unlock(&vfsmount_lock); return
#include #include #include #include #include... #include #include #include #define ROMFS_MAGIC...struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount
挂载到linux的VFS中 vfs对象 VFS采用了面向对象的设计思路,将一系列概念抽象出来作为对象而存在,它们包含数据的同时也包含了操作这些数据的方法。...Linux将文件的相关信息,比如访问权限、大小、创建时间等信息,与文件本身区分开来。文件的相关信息又被称为文件的元数据。 (3)目录项(struct dentry)。...除了上述4个主要对象外,VFS还包含了其他很多对象,比如用于描述各种文件系统类型的struct file_system_type,用于描述文件系统安装点的struct vfsmount等。...一个文件被打开的时候,它的file对象是使用dentry、inode、vfsmount对象中的信息填充的,比如它对应的文件操作f_op由inode对象的i_fop字段得到。 ?...这样就将磁盘挂载到linux的VFS文件文件系统中了。其中,file_system_type用于描述具体文件系统的类型,struct vfsmount用于描述一个文件系统的安装实例。
再看下init_mount_tree方法: // fs/namespace.c static void __init init_mount_tree(void) { struct vfsmount...看下vfs_kern_mount方法: // fs/namespace.c struct vfsmount *vfs_kern_mount(struct file_system_type *type,...*name, void *data) { struct fs_context *fc; struct vfsmount...继续看下vfs_kern_mount的fc_mount方法: // fs/namespace.c struct vfsmount *fc_mount(struct fs_context *fc) {...再看下fc_mount中的的vfs_create_mount方法: // fs/namespace.c struct vfsmount *vfs_create_mount(struct fs_context
注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题...(3)在Linux 系统中,socket 属于文件系统的一部分,网络通信可以被看作是对文件的读取,使得我们对网络的控制和对文件的控制一样方便。...(二)、套接字接口的种类 Linux 支持多种套接字种类,不同的套接字种类称为“地址族”,这是因为每种套接字种类拥有自己的通信寻址方法。Linux 所支持的套接字地址族见表12.3。...内核中为套接字定义了一种特殊的文件类型,形成一种特殊的文件系统sockfs,其定义于net/socket.c: static struct vfsmount *sock_mnt; static DECLARE_FSTYPE...安装时有个作为连接件的vfsmount 数据结构,这个结构的地址就保存在一个全局的指针sock_mnt 中。
Linux 作为一个类 Unix 操作系统,也努力实现这个目标。...所以,Linux 内核使用了一些技巧来模拟接口这个概念。 下面来介绍一下 Linux 内核是如何实现的。...dentry_open() 函数中实现,如下所示: static struct file * __dentry_open(struct dentry *dentry, struct vfsmount...4. inode结构 在 Linux 内核中,inode 结构表示一个真实的文件。为什么有了 dentry 结构还需要 inode 结构呢?这是因为 Linux 存在硬链接的概念。...我们再来重温下赋值过程: static struct file * __dentry_open(struct dentry *dentry, struct vfsmount
最近在看一本 Linux 环境编程的书,加上之前工作中接触了一些关于存储的东西,便突然有兴趣整理一下 Linux 是怎么支撑文件系统的。...而 mount 操作不仅会完成挂载,还会创建一个 vfsmount 结构,以代表一个挂载点。...vfsmount 的代码在 linux/mount.h 中: struct vfsmount { struct dentry *mnt_root; /* root of the mounted tree...传统的文件系统:ext2 ext2 曾是一款优秀的文件系统,是Linux 上使用最为广泛的文件系统,也是原始 Linux 文件系统 ext 的继任者。...参考 •《Linux/UNIX 系统编程手册》•《Linux 内核设计与实现》•《Porting the SGI XFS File System to Linux》
sb_flags, int mnt_flags, const char *name, void *data) { struct file_system_type *type; struct vfsmount...以下几个函数都是比较重要的: vfs_kern_mount mount_too_revealing do_add_mount 我们下面先分析第一个函数vfs_kern_mount: struct vfsmount...我们下面分析第二个函数mount_too_revealing,在fs/namespace.c文件中: static bool mount_too_revealing(struct vfsmount *mnt...接下来我们看看lock_mount函数: static struct mountpoint *lock_mount(struct path *path) { struct vfsmount *mnt;... dentry = path->dentry = dget(mnt->mnt_root);////path->dentry指向找到的vfsmount的根dentry goto retry;//继续查找下一个挂载
一、Linux文件系统目录结构 1./bin 包含基本命令,如ls、cp、mkdir,这个目录中的文件都是可执行的 2..../sys Linux2.6内核所支持的sysfs文件系统被映射在此目录 二、Linux文件系统与设备驱动 ?...list_head fu_list; struct rcu_head fu_rcuhead; }f_u; struct dentry *f_dentry;/*与文件关联的目录入口结构体*/ struct vfsmount...它是Linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。 struct inode{ ...
跟随陈老师学习linux内核两个月了,对linux内核产生了极大的兴趣,最近学习文件系统,有一些自己的看法,很荣幸能在linux内核之旅进行分享^_^ 本篇文章使用尽量通俗的语言来说明linux内核文件系统中各个数据结构之间的关系...由于linux内核足够复杂,就会有多种解释方式,我认为所有关于linux内核的书籍,都是不同作者对内核的不同的看法,说不定这些看法对于linus本人来说都是很巧妙的,所以我在这里也大胆地提出自己对linux...第三条线(蓝紫色) 我们直接来看图中的第7个结构体,vfsmount结构体,这里先说一下为什么会有这么个结构,我们在第二条线中说过了文件系统注册时的file_struct_type结构体了,但这个信息还不够...,我们要正确使用一种文件系统,就必须mount到根文件系统的某个目录上去,记得要root权限哦,这个时候还是为了管理上的方便,又抽象出来一个结构体vfsmount,它存放的就是文件安装的相关信息,它和PCB...由于自己接触linux内核时间不长,才疏学浅,班门弄斧了,如果有错误的地方欢迎大家指正,小赵万分感谢:-D
struct list_head f_list; 567 struct dentry *f_dentry; 568 struct vfsmount...lock; 8 int umask; 9 struct dentry * root, * pwd, * altroot; 10 struct vfsmount
www.firefoxbug.com/index.php/archives/2801/ https://www.cnblogs.com/allegro/archive/2011/04/18/2019598.html 1 理解Linux...还是看看内核源码的相关内容,在文件fs/inode.c中有个touch_atime函数: void touch_atime(struct vfsmount *mnt, struct dentry *dentry
本文阐述 Linux 中的文件系统部分,源代码来自基于 IA32 的 2.4.20 内核。...文章试图从一个比较高的角度来解释Linux 下的 VFS 文件系统机制。 1.摘要 本 文阐述 Linux 中的文件系统部分,源代码来自基于 IA32 的 2.4.20 内核。...建议读者在阅读本文前,先尝试着自己阅读一下文件系统的源代码,以便建立起 Linux下文件系统最基本的概念,比如至少应熟悉 super block, dentry, inode,vfsmount等数据结构所表示的意义...所以在每次系统初始化期间,Linux 都首先要在内存当中构造一棵VFS 的目录树(在 Linux 的源代码里称之为 namespace),实际上便是在内存中建立相应的数据结构。...在这个场景里,do_kern_mount() 做的工作主要是: 1)调用 alloc_vfsmnt() 函数在内存里申请了一块该类型的内存空间(struct vfsmount*mnt),并初始化其部分成员变量
领取专属 10元无门槛券
手把手带您无忧上云