鸿蒙内核源码分析(挂载目录篇)|为何文件系统需要挂载|百篇博客分析openharmony源码|v65.01(代码片段)

鸿蒙内核源码分析 鸿蒙内核源码分析     2022-12-19     435

关键词:

百篇博客系列篇.本篇为:

v65.xx 鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载 | 51 .c .h .o

文件系统相关篇为:

关于文件系统的介绍已经写了三篇,但才刚刚开始,其中的 文件系统篇 一定要阅读,用生活中的场景去解释计算机各模块设计的原理和运行机制是整个系列篇最大的特点,计算机文件系统相关概念是非常的多的,若不还原其本质,不跳出这些概念去看问题是很难理解它为什么要弄这么些东东出来让你头大. 反之,如果搞明白了这些概念背后的真相你想忘记它们都很难,问题是经不起追问的, 多追问几个为什么就会离本源越来越近.

前几篇中追问了以下几个问题:

  • 对内核来说inode真的是唯一的吗? 答案是否定的,使用电脑的经验告诉我们,当把电脑硬盘拆下来挂到其他电脑上时,里面的数据一样能访问,并没有让你一切重来,而inode是存放硬盘上的,你没有办法让已编好序号的inode按你的逻辑重排,这不合理更不科学. 所以结论是inode的全局唯一性不是不想做,而是压根做不到.inode唯一性仅限于某个文件系统的内部.
  • 经验还告诉我们硬盘可以有多个分区,每个分区可以被格式化成不同的文件系统.(例如:C盘:NTF,D盘FAT32,E盘ext),数据可以相互拷贝,毫无障碍.不同的文件系统是如何实现文件迁移到呢 ? 具体实现细节是怎样的 ?

如果想明白了这些问题, 就能 倒推 为什么要有目录,为什么需要挂载才能使用, 为什么需要根文件系统.一切将是那么的水到渠成 .
先说目录,从内核视角看目录可不能像普通老百姓从用户视角去看,目录是为了屏蔽文件系统之间的差异而设计出来的概念,也就说必须在inode的局部唯一性之上存在一个全局唯一性才能解决统一性问题.目录从更大尺度上去兼容并蓄各文件系统.

那它是如何解决的呢?

  • 首先各个文件系统记录了自己内部目录层级关系的,这个在 文件系统篇 | 目录项 中已经说过了. 这种关系是绝对的但也是相对的,绝对是对内,相对是对外. 例如:
    A文件系统内部如下:
    ├─古龙系列 inode id : 789
    │  ├─小李飞刀 inode id : 56
    │  ├─楚留香 inode id : 342
    │  └─陆小凤 inode id : 432
    └─金庸系列 inode id : 5567
        ├─倚天屠龙记 inode id : 89
        ├─射雕英雄传 inode id : 1212
        └─笑傲江湖 inode id : 567843
    
    B文件系统内部如下:
    ├─席绢系列  : inode id : 87 
    │  ├─上错花轿嫁对郎 : inode id : 89 
    │  ├─吻上你的心 : inode id : 789 
    │  └─红袖招 : inode id : 56 
    └─琼瑶系列 : inode id : 321 
        ├─在水一方 : inode id : 234 
        ├─梅花三弄 : inode id : 5678 
        ├─烟雨濛濛 : inode id : 987 
        └─还珠格格 : inode id : 23 
    
    其中789,89两个文件系统中都用到了,但它们在内部是唯一的.在A文件系统中通过 789 就能找到 56,342,432,并且能得到相对路径: 古龙系列/小李飞刀,古龙系列/楚留香 .也就是说拿着inode只要进入了本文件系统地盘,那都不叫事,事都能给你办的妥妥的. 那如何才能进入而且不会搞错呢?

挂载目录

答案就是: 挂载目录,也叫挂载点,集体统一指挥的前提是需要先回归集体.如果已经有一颗目录树,将你们的目录树挂上来形成一颗更大的树不就统一了吗? 例如已有:

├─小说系列 inode id : 2
│  ├─武侠小说 inode id : 13
│  ├─言情小说 inode id : 14

其实它也是个文件系统,叫根文件系统, 它的 inode也是独立的, 并且能得到相对路径 小说系列/武侠小说,小说系列/武侠小说
通过两个 mount动作, 将它变成如下所示

├─小说系列 (根文件系统)
    ├─武侠小说 (根文件系统)
    │  ├─古龙系列 (A文件系统)
    │  │  ├─小李飞刀
    │  │  ├─楚留香
    │  │  └─陆小凤
    │  └─金庸系列 (A文件系统)
    │      ├─倚天屠龙记
    │      ├─射雕英雄传
    │      └─笑傲江湖
    └─言情小说 (根文件系统)
        ├─席绢系列 (B文件系统)
        │  ├─上错花轿嫁对郎
        │  ├─吻上你的心
        │  └─红袖招
        └─琼瑶系列 (B文件系统)
            ├─在水一方
            ├─梅花三弄
            ├─烟雨濛濛
            └─还珠格格

哦,原来整颗目录树是由这三个文件系统像搭积木一样拼接起来.而武侠小说,言情小说这两个链接点就叫 挂载点,也叫 挂载目录 ,所以明白了挂载的本质了吗?

挂载点有inode节点的功能,但是个独立的概念, 在操作上跟inodeinode所指向的数据块的操作也都不一样.

//挂载操作
struct MountOps 
    int (*Mount)(struct Mount *mount, struct Vnode *vnode, const void *data);//挂载
    int (*Unmount)(struct Mount *mount, struct Vnode **blkdriver);//卸载
    int (*Statfs)(struct Mount *mount, struct statfs *sbp);//统计文件系统的信息,如该文件系统类型、总大小、可用大小等信息
;
struct Mount 
    LIST_ENTRY mountList;              /* mount list */			 //通过本节点将Mount挂到全局Mount链表上
    const struct MountOps *ops;        /* operations of mount */ //挂载操作函数	
    struct Vnode *vnodeBeCovered;      /* vnode we mounted on */ //要被挂载的节点 即 /bin1/vs/sd 对应的 vnode节点
    struct Vnode *vnodeCovered;        /* syncer vnode */		 //要挂载的节点	即/dev/mmcblk0p0 对应的 vnode节点
    LIST_HEAD vnodeList;               /* list of vnodes */		//链表表头
    int vnodeSize;                     /* size of vnode list */	//节点数量
    LIST_HEAD activeVnodeList;         /* list of active vnodes */	//激活的节点链表
    int activeVnodeSize;               /* szie of active vnodes list *///激活的节点数量
    void *data;                        /* private data */	//私有数据,可使用这个成员作为一个指向它们自己内部数据的指针
    uint32_t hashseed;                 /* Random seed for vfs hash */ //vfs 哈希随机种子
    unsigned long mountFlags;          /* Flags for mount */	//挂载标签
    char pathName[PATH_MAX];           /* path name of mount point */	//挂载点路径名称  /bin1/vs/sd
    char devName[PATH_MAX];            /* path name of dev point */		//设备名称 /dev/mmcblk0p0
;

解读

  • mountList : 挂载点由双向链表全局统一管理
  • vnodeBeCovered:,记录挂到根文件系统的哪个节点上.
  • vnodeCovered: 设备也是一种文件,也被统一管理,统一在/dev目录下,内核会给设备的每个分区分配一个vnode节点,一个分区对应一个文件系统,设备文件后续有专门的介绍,此处不展开.
  • vnodeList: 指的是A/B文件系统的节点链表,由挂载点结构体记录.
  • activeVnodeList: A 文件系统节点的使用情况,统一由双向链表管理.
  • activeVnodeSize: A 文件系统已被使用的节点数
  • data 这是文件系统的私有数据,跟 索引节点篇 | Vnode -> data 一样理解.
  • pathName :这个很重要,记录了小说系列/武侠小说,因为文件的绝对路径是拼接起来的,以小说系列/武侠小说/古龙系列/小李飞刀这个完整的路径来说,它是由 小说系列/武侠小说(根文件系统提供) + 古龙系列/小李飞刀(A文件系统提供) 这两部分拼成的.
  • devName :一般名称类似于mmcblk0p0 = mmc + block0 + Partition0
    • mmc: MultiMediaCard 可理解为硬盘
    • block0: 0号块设备
    • Partition:0号分区,一个分区上安装一个文件系统.
  • MountOps ops: 每个文件系统挂载方式是不用的,都需要实现这几个接口(挂载,卸载,统计),此处以proc文件系统为例,看下它的mount过程.
    // proc 对 MountOps 接口实现
    const struct MountOps procfs_operations = 
        .Mount = VfsProcfsMount,//装载
        .Unmount = NULL,
        .Statfs = VfsProcfsStatfs,//统计信息
    ;
    //挂载实现,找个vnode节点挂上去 
    int VfsProcfsMount(struct Mount *mnt, struct Vnode *device, const void *data)
    
        struct Vnode *vp = NULL;
        int ret;
    
        spin_lock_init(&procfsLock);
        procfsInit = true;		//已初始化 /proc 模块
    
        ret = VnodeAlloc(&g_procfsVops, &vp);//分配一个节点
        if (ret != 0) 
            return -ENOMEM;
        
    
        struct ProcDirEntry *root = GetProcRootEntry();
        vp->data = root;
        vp->originMount = mnt;//绑定mount
        vp->fop = &g_procfsFops;//指定文件系统
        mnt->data = NULL;
        mnt->vnodeCovered = vp;
        vp->type = root->type;
        if (vp->type == VNODE_TYPE_DIR) //目录节点
            vp->mode = S_IFDIR | PROCFS_DEFAULT_MODE;//贴上目录标签
         else 
            vp->mode = S_IFREG | PROCFS_DEFAULT_MODE;//贴上文件标签
        
    
        return LOS_OK;
    
    

问题

上面提到 挂载就需要一个已经存在的文件系统提供目录,也就是根文件系统,但根文件系统又是怎么来的呢?

鸿蒙内核源码分析.总目录

v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 百篇博客分析 | 51 .c .h .o

百万汉字注解.百篇博客分析

百万汉字注解 >> 精读鸿蒙源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< gitee | github | csdn | coding >

百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,主流站点定期更新中< 51cto | csdn | harmony | osc >

关注不迷路.代码即人生

热爱是所有的理由和答案 - turing

原创不易,欢迎转载,但麻烦请注明出处.

v74.01鸿蒙内核源码分析(控制台)|一个让很多人模糊的概念|百篇博客分析openharmony源码

...制台篇)|一个让很多人模糊的概念文件系统相关篇为:v62.02鸿蒙内核源码分析(文件概念)|为什么说一切皆是文件v63.04鸿蒙内核源码分析(文件系统)|用图书管理说文件系统v64.06鸿蒙内核源码分析(索引节点)|谁是文件系统最重要的概念... 查看详情

v74.01鸿蒙内核源码分析(控制台)|一个让很多人模糊的概念|百篇博客分析openharmony源码

...制台篇)|一个让很多人模糊的概念文件系统相关篇为:v62.02鸿蒙内核源码分析(文件概念)|为什么说一切皆是文件v63.04鸿蒙内核源码分析(文件系统)|用图书管理说文件系统v64.06鸿蒙内核源码分析(索引节点)|谁是文件系统最重要的概念... 查看详情

鸿蒙内核源码分析(根文件系统)|先挂到`/`上的文件系统|百篇博客分析openharmony源码|v66.01(代码片段)

百篇博客系列篇.本篇为:v66.xx鸿蒙内核源码分析(根文件系统)|先挂到/上的文件系统|51.c.h.o文件系统相关篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.ov63.xx鸿蒙内核源码分析(文件系统篇)|用图书管理说文... 查看详情

鸿蒙内核源码分析(文件句柄篇)|深挖应用操作文件的细节|百篇博客分析openharmony源码|v69.01(代码片段)

百篇博客系列篇.本篇为:v69.xx鸿蒙内核源码分析(文件句柄篇)|深挖应用操作文件的细节|51.c.h.o文件系统相关篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.ov63.xx鸿蒙内核源码分析(文件系统篇)|用图书管理说... 查看详情

鸿蒙内核源码分析(管道文件篇)|如何降低数据流动成本|百篇博客分析openharmony源码|v70.01(代码片段)

百篇博客系列篇.本篇为:v70.xx鸿蒙内核源码分析(管道文件篇)|如何降低数据流动成本|51.c.h.o文件系统相关篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.ov63.xx鸿蒙内核源码分析(文件系统篇)|用图书管理说文... 查看详情

鸿蒙内核源码分析(索引节点篇)|谁是文件系统最重要的概念|百篇博客分析openharmony源码|v64.01(代码片段)

百篇博客系列篇.本篇为:v64.xx鸿蒙内核源码分析(索引节点篇)|谁是文件系统最重要的概念|51.c.h.o文件系统相关篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.ov63.xx鸿蒙内核源码分析(文件系统篇)|用图书管理... 查看详情

鸿蒙内核源码分析(vfs篇)|文件系统和谐共处的基础|百篇博客分析openharmony源码|v68.01(代码片段)

...。”《论语》:雍也篇百篇博客系列篇.本篇为:v68.xx鸿蒙内核源码分析(VFS篇)|文件系统和谐共处的基础|51.c.h.o文件系统相关篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.ov63.xx鸿蒙内核源码分析(文件系... 查看详情

鸿蒙内核源码分析(字符设备篇)|字节为单位读写的设备|百篇博客分析openharmony源码|v67.01(代码片段)

百篇博客系列篇.本篇为:v67.xx鸿蒙内核源码分析(字符设备篇)|字节为单位读写的设备|51.c.h.o文件系统相关篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.ov63.xx鸿蒙内核源码分析(文件系统篇)|用图书管理说文... 查看详情

鸿蒙内核源码分析(文件系统篇)|用图书管理说文件系统|百篇博客分析openharmony源码|v63.01(代码片段)

百篇博客系列篇.本篇为:v63.xx鸿蒙内核源码分析(文件系统篇)|用图书管理说文件系统|51.c.h.o文件系统相关篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.o本篇讲一个大型图书馆的管理方案,来说清楚计算机... 查看详情

鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|百篇博客分析openharmony源码|v62.01(代码片段)

百篇博客系列篇.本篇为:v62.xx鸿蒙内核源码分析(文件概念篇)|为什么说一切皆是文件|51.c.h.o本篇开始说文件系统,它是内核五大模块之一,甚至有Linux的设计哲学是"一切皆文件"的说法。所以其重要性不言而喻.搞不清楚文件系... 查看详情

鸿蒙内核源码分析(ninja应用篇)|简单而快速的构建系统|百篇博客分析harmonyos源码|v61.01(代码片段)

OpenHarmony|鸿蒙研究站|WeHarmony<国内|国外>百篇博客系列篇.本篇为:v61.xx鸿蒙内核源码分析(ninja应用篇)|简单而快速的构建系统|51.c.h.o编译构建模块相关篇为:v60.xx鸿蒙内核源码分析(gn应用篇)|gn语法及在鸿蒙的使用|51.c.h.ov59.xx鸿... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

...MMU、SVC栈、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传递复杂的参数v77.01鸿蒙内核... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

...MMU、SVC栈、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传递复杂的参数v77.01鸿蒙内核... 查看详情

v73.01鸿蒙内核源码分析(注释文档)|内核所有函数调用关系图|百篇博客分析openharmony源码

...文档篇)|内核所有函数调用关系图前因后果相关篇为:v08.03鸿蒙内核源码分析(总目录)|百万汉字注解百篇博客分析v09.04鸿蒙内核源码分析(调度故事)|用故事说内核调度v10.03鸿蒙内核源码分析(内存主奴)|皇上和奴才如何相处v13.05鸿蒙... 查看详情

v87.01鸿蒙内核源码分析(内核启动篇)|从汇编到main()|百篇博客分析openharmony源码

...MMU、SVC栈、热启动、内核映射表内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传递复杂的参数v77.01鸿蒙内核... 查看详情

v84.01鸿蒙内核源码分析(tlfs算法篇)|图表解读tlfs原理|百篇博客分析openharmony源码

...关键词:TLFS、内存池、malloc、free内存管理相关篇为:v31.02鸿蒙内核源码分析(内存规则)|内存管理到底在管什么v32.04鸿蒙内核源码分析(物理内存)|真实的可不一定精彩v33.04鸿蒙内核源码分析(虚拟内存)|虚拟的也是真实的v34.03鸿蒙内... 查看详情

v83.01鸿蒙内核源码分析(编码方式篇)|机器指令是如何编码的|百篇博客分析openharmony源码(代码片段)

...存指令、跳转指令、SVC(软件中断)内核汇编相关篇为:v74.01鸿蒙内核源码分析(编码方式)|机器指令是如何编码的v75.03鸿蒙内核源码分析(汇编基础)|CPU上班也要打卡v76.04鸿蒙内核源码分析(汇编传参)|如何传递复杂的参数v77.01鸿蒙内核... 查看详情

鸿蒙内核源码分析(构建工具篇)|顺瓜摸藤调试鸿蒙构建过程|百篇博客分析harmonyos源码|v59.01(代码片段)

OpenHarmony|鸿蒙研究站|WeHarmony<国内|国外>百篇博客系列篇.本篇为:v59.xx鸿蒙内核源码分析(构建工具篇)|顺瓜摸藤调试鸿蒙构建过程|51.c.h.o编译模块相关篇为:v58.xx鸿蒙内核源码分析(环境脚本篇)|如何防编译环境中的牛皮癣|51.c.h.... 查看详情