空间管理员(一)AFS文件目录系统索引节点vfs_inode结构

空间管理员(一)AFS文件目录系统索引节点vfs_inode结构



前言

现实界:
无数相互作用而运动着的物体,其形态在时空中不断创生与消亡,而构成物体之最小物质单位是不生不灭的、永恒运动的、相互作用的元子(纯阳元子(带一个单位正能量)、纯阴元子(带一个单位负能量)、中元子)。同性元子相斥,异性元子相吸;一个纯阳元子和一个纯阴元子吸在一起构成了中性的元子对(简称中元子)。中子,中微子,光子都是由许多元子组成;而正电子和负电子也是元子的容器,他们除了含有许多中元子外还含有纯阳或纯阴的元子。简单的说万物都是五彩缤纷的元子的容器 ,空间是万物的容器。空间是连续的、无限的,是三维的、各向同性的,空间是可以用各向同性的坐标系统进行标识的。时间是物质运动过程的持续性和顺序性,是永恒的;时间是连续的、单向的、均匀流逝的、无始无终的,时间是可以用均匀计时系统进行标识的。质量是物体容器的本质属性之一,质量是物体容器包含元子数的多少,没有质量小于或等于零的物质。能量是物质运动的状态属性,是元子的本性体现。从宏观上,物质的能量有几种存在形式;物质内的能量在不同形式之间可以互相转化,但总能量不变。在数学中,多维变量可以称作多维空间。在物理学中,有一维空间(线)、二维空间(面)和三维空间(体),现实界不存在大于三维的物理空间。数学中的多维空间,不能直接移植到物理学中;只有在维数小于等于3(不包含时间)时,可以对应。

虚拟界(精神界、信息界、幂想界、意念界):
虚拟界是现实界的“部分反映”,附属于物体中,以呈现于现实界、“一花一世界”。虚拟界可以“部分模拟”现实界,可以附植于不同形态的物体,可以程序模式存在;或因附属的物体消亡而消失,但可以复制、转生、附属于多个物体。虚拟界并没有受限于现实界的时空物理规律,虚拟界的事物可以无视现实界的物体最大运动速度为光速的规律、可以瞬移;本质上没有“万物相互作用”、元子、物质、物体、能量、力、等等概念的说法,即使有、也只是“模拟”。可以说虚拟界有点类似于现实界的“设计蓝图”,物体必定包含有小部分的“本能虚拟界”;当物体包含一定程度的“规则虚拟界”时,我们说该物体有了“智慧”,“智慧生物”具有更强大的虚拟界时、则称之为“大能”。“设计蓝图”在现实界的一定环境和外部操作下,可以转化为实物表现;想做到“思维转化”或说虚拟界的“具现”,必须达到“大能级的意念力”。

空间:
何为空间?即使空间亦非空无一物的,除了空间物质外,它还隐藏著最深刻的物理和谜般的现实。星体生灭无常,可是虚空却恒久常存。即使征服了所有星体,虚空的秘密仍只是永远深藏在虚无飘渺,捉不住看不透谜样般的空白之后。当我深刻地思索著眼前的事实,看著这不断运动、发展和变化的神迹时,感到超越了人类的局限和缺陷。感受到永恒那深不可测的冷漠和动人心弦的美态。自古以来,人类一直在追寻某种东西。那可以是爱情、荣耀、永生或异性,同样是一种追寻,当然也包括神在内。生命的目的,就是要找寻生命的目的,自恒古以来,便是如此!生命的意义:为了生存,艰难的进化!生与死融为了一体、美与丑只是同一件事的正反两面,最终有的只是“存在”。不管过去的、现在的、将来的、物质世界的、精神世界的,存在皆容器!呵呵,这里不想再谈论哲学物理下去了、那将花费我毕生的精力。简单地说:内存和磁盘空间、等等的管理和分配以及文件目录系统都归属于“空间管理员”。设备和设备驱动不外是一种“内存文件目录系统”sysfs、自然也归属于“空间管理员”的范畴。


一、VFS(Virtual File System)虚拟文件系统

物理内存地址48位,内存缓冲区(页)号、4G个,物理内存一半用于内核分配、另一半用于用户进程虚拟内存映射分配;进程虚拟内存空间地址48位,每一个进程都视为有256TB的虚拟内存空间,高128TB为内核物理内存映射的虚拟空间、通常是只读。

Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问;除了我们普通意义理解的文件之外,目录、字符设备、块设备、 套接字、进程、线程、管道等都被视为是一个“文件”。这就是Linux系统“一切皆是文件”的体现(其实Linux做的并不彻底,因为CPU、内存、网络等还不是文件,如果真的需要、一切皆是文件,而AOS则是尽量实现这一目标)。有AFS、EXT2、EXT3、EXT4、FAT16、FAT32、NTFS、minix、proc等(伪文件系统)、设备、等等文件体系,VFS是一个提供open()、read()、write()等等系统调用的统一的操作界面和应用编程接口,而不用关心底层的存储介质和文件系统类型就可以工作的内核软件抽象层;VFS其向上提供了统一的文件访问接口,而向下则兼容了各种不同类型的文件系统。VFS层通过定义一个清晰的VFS接口,以将文件系统的通用操作和具体实现分开。多个VFS接口的实现可以共存在同一台机器上,它允许访问已装在本地的多个类型的文件系统。VFS基于称为v节点的vfs_inode文件表示结构,该结构包括一个数值标识符以表示位于整个网络范围内的唯一文件。该网络范围的唯一性用来支持网络文件系统。内核中为每个活动节点(文件或目录)保存一个vfs_inode结构,v(VFS)节点是在内存中建立的。不同类型的文件系统通过不同的file_operations方法表实现相应功能。
简易操作系统AOS的VFS定义的4种主要对象类型是:

超级块对象(superblock object)表示整个文件系统。
    索引节点(index node)对象(vfs_inode object)表示一个单独的文件或设备的i节点信息(文件属性记录FAR)。
    文件对象(file object、或说file_vma对象)表示一个打开的文件。
    v节点信息对象(vfs_node object、或说vnode )有点类同linux的目录项对象(dentry object),实际区别较大。已经包含在v节点对象结构中,是故AOS相比linux的4大结构对象而言、只是3大结构对象(超级块对象、v节点对象、文件对象)。
VFS对每种类型的对象都定义了一组必须实现的操作,这些类型的每一个对象最终都包含了一个指
向函数表的指针,函数表列出了实际上实现特定对象的操作函数。
AOS类模式是基于数据结构的对象、但结构不包含方法,使用统一的可装卸模块动态静态方法库,
不是C++的类模式;32位的方法号,高16位是方法类号、次13位是方法组号,最低5位是方法号
(方法组号 + 方法号,也称为16位系统调用号)。

1)、vfs_inode结构反映的是AFS磁盘文件系统的索引节点对象、256字节,表示一个单独的文件或设备的i节点信息(文件属性记录FAR);反映AFS磁盘文件体系时、可以说是AFS_inode在内存中的一个拷贝,系统根文件系统也是AFS模式;其它类型的文件系统、如EXT2–EXT4、FAT32、NTFS、等等,则需要通过不同的方法表来实现其异构的i节点或模拟i节点到vfs_inode对象的映射而建立相应操作。得有一套转换操作方法组:关于文件i节点信息操作的struct inode_operations *i_op; 和关于v节点信息操作的struct vnode_operations *i_vop;
内核的设备文件dev索引节点对象dev_inode则是与根目录的vfs_inode对象有点类似、其实AOS也是将设备文件视为一个内存文件体系根目录节点。动态变化“socket通信连接虚拟设备文件”connect索引节点对象则为cnode,AOS将网络、进程等等也纳入虚拟设备文件范畴。

2)、简化“类和对象”的描述,去除Kobject内核对象、kset等等的大量结构环复杂设备表述(那不是业余玩家看的、是砖家叫兽的东东)。大幅度减少结构种类,尽可能规范统一到v节点结构:vfs_inode,去除链表、缩减方法数,“一切皆文件、皆v节点”。依据权限而对v节点的各种字段属性直接或指针间接操作、归类为简单的公用读写方法(汇编或C、没几条指令),大幅度减少设备驱动及内核的代码量。

3)、创建或删除文件、目录、设备、等操作同一,使用可视化(类似windows)“选择和填表”模式,大幅度减少代码量的编写。

4)、一些设备是资源分配“辅助”设备,没有file_operations方法表、只是一些简单v节点的各种字段属性公用操作方法;如中断控制器 (NVIC)、外部中断和事件控制器 (EXTI)、DMA、IO引脚复用配置、IO引脚电气特性配置、系统配置控制器(SYSCFG)、站管理接口SMI、时钟控制 (RCC),等等设备。

1、索引节点(index node)对象(vfs_inode object)表示一个单独的文件或设备的i节点信息(文件属性记录FAR)。

文件索引节点(index node)、也称i节点inode,通常:在内存中打开的vfs_inode称为v节点vnode、在磁盘空间中的称为i节点inode。不同文件系统的表述,如磁盘空间:afs_inode、ext2_inode、ext4_inode等等,在内存中打开的如vfs_ntfs_inode、vfs_ext2_inode、vfs_fat32_inode等等都称之为文件类vfs_inode。文件索引节点对象inode包含文件的相关信息(诸如文件的大小、磁盘位置、文件权限、时间戳、文件类型和标志、相关标识符、等等),其实质就是文件属性记录FAR(File Attribute record,也就是对文件属性的描述,也称为文件索引节点对象inode object)。
AFS的文件 = 元数据(文件属性数据) + 数据(文件具体内容),
元数据 = 文件属性记录FAR(文件索引节点对象inode)+ 文件名字属性记录NAR(Name Attribute record)。

在AOS中,“一切皆文件、皆v节点”。在内存中VFS除了表述不同文件系统的文件类v节点vfs_inode,还有设备类v节点dev_inode(还分为实际设备和虚拟设备2类),虚拟设备:描述“socket通信连接connect文件”的动态生灭cnode,描述进程控制块(process control block)的pcb_inode,等等。设备类v节点没有磁盘空间对应,只存在于内存;设备类v节点一样会有文件对象(file object)结构,使用的是进程打开文件号fd,所有进程都属于根进程打开的进程,虚拟设备类v节点的名字属性为数值(不用字符串名字),有关虚拟设备类另文讨论。
所有的v节点、i节点大小都是256字节。为简化、这2类文件节点的结构同一,有关v节点信息32b(字节)在磁盘空间上无意义(可视为随机数)。

AFS磁盘空间:
⚫ i节点表inode table (表本身也需磁盘的存储空间、inode号最大4G个)1Tb级。
⚫ 文件磁盘空间缓冲区表file disk buffer table(小文件可用一个系统分配(无需专用算法)的磁盘缓冲区(1页8扇区4Kb)作为文件内容存放)最大16Tb级。
⚫ 磁盘空间文件名字哈希i节点映射表FNIT(file_name_hash_inode table) 0.5Tb级(就算平均一个文件项占用128b,也需4G*128b = 0.5Tb的磁盘空间)。
⚫ 用户登录名字哈希用户ID表、/etc/passwd(sys权限)。

AFS内存空间:
⚫ v节点表vnode table表本身也需要占用内存空间约32M(通常v节点号最大32M个)*256b = 4Gb级。
⚫ 系统内存空间缓冲区表mem buffer table (v节点可使用2个内存缓冲区(1页8扇区4Kb))最大128Gb级。
⚫ flash空间的设备和文件目录路径名字哈希v节点映射表PNVT(path_name_hash_vnode table)4Gb级文件。
⚫ 在内存中打开的FNT文件名字表file_name table(PNVT只是包含有部分的内存打开v节点之目录路径名,磁盘非目录的文件名字总是去FNIT表中寻找的(这需要一次磁盘IO),从FNIT表中寻找到的文件名字符串是安装到FNT文件目录名字表)。
⚫ 文件对象(file object)打开表fot,由进程(task_struct(linux),
struct pcb_inode)的文件描述符表fdt项来指引。
⚫ 虚拟进程设备表pcb_inode table,最大32k个进程。

2、flash的设备和文件目录路径名字哈希v节点映射表PNVT(path_name_hash_vnode table)4Gb级文件

磁盘文件inode号(32位数字编号)一一对应于、父目录路径 +文件名,任一条路径是唯一的、任一条路径 + 文件名也是唯一的。路径(path)指通向某个目标的道路,在网络中、路径指的是从起点到终点的全程路由,在文件系统中、路径指的是从根目录到下级目录…到父目录、到最终文件的全程、等于父目录路径(从根目录/到父目录的路径)+最终文件名。同一个父目录路径下不能有相同名字的文件,这是规则。AFS最大4G个inode号,非根目录下文件数不限制,只受限于inode号资源;不同路径下允许同名文件、同名目录,以及文件和目录同名,例如:路径1/abc.txt、路径2/abc.txt、路径i/abc.txt,/…/abc/abc/abc/abc/abc。不同路径下的同名文件或目录,有不同的inode号。AOS系统中,所有的文件与目录都是由根目录/开始,不是以/开头的就是相对路径。

⚫ 目录名字–>硬件哈希4字MD5–>二次哈希到20位线性表相对指针字(二维单向链表首指针、粒度为扇区)–>二维单向链表(横向为不同目录名字映射(首字相对指针next、为0结束),纵向为相同目录名字不同父目录路径单向链表相对指针(尾字相对指针next、为0结束))。
PNVT表单元格内容共4字:父目录路径inode号、vnode号,本路径(父目录路径+本目录名字)的inode号、vnode号。
1M项的二次哈希到20位H20T线性表hash20 table:每项为一个扇区首指针。扇区首字“不同目录名字映射”相对指针next(指向相同哈希项另一个不同目录名字映射扇区)、为0结束,扇区次字:4位不同目录名字项数(1–4位)、12位相同目录名字项数(8–11位),8位目录名字长度,8位路径深度(最大16层、8扇区4Kb)。之后是:目录名字以字粒度的字符串数组(最大64字),跟着是一项项PNVT表单元格内容(每项4字),如果不够装时、尾字相对指针next指向下一个扇区(继续安装PNVT表单元格)、为0结束。

⚫ AFS文件目录系统的vfs_inode结构已经包含了Linux的inode结构对象和“复杂表述”的目录项(dentry)结构对象之功用,也同一了磁盘afs_inode结构。PNVT表的作用是为新建目录分配磁盘空间inode号、内存空间vnode号,解析目录路径时、为每个目录名字快速寻找相应的vnode号,没有的(0xffff)则分配,最终将目录路径解析为相应的vnode号路径(目录名字以相应的vnode号代替)。

struct vnode_no {
   
	 // vnode号结构。
      u4   vn_flags;      // 高4位vnode号标志。
/*
VNMP;  	 // 0、v节点已经在内存中打开或说存在Memory presence,1、未打开。VFS暂时不用该标志(未打开0xffff)。
VNU;     // 1、被使用Used,0、未被使用。VFS暂时不用该标志。
VOID;    // 0、文件相应的v节点号已经无效void、或说inode节点已被删除了或路径不正确,1、有效。
Reserve; // 保留备用标志,1。
*/
      u28 vn_nodeno; // 低28位vnode号,可表示到约2.7亿个(将来内存达到Tb级时、内存中可以打开亿级的v节点数量)。
};

⚫ 磁盘空间文件名字哈希i节点映射表FNIT(file_name_hash_inode table)操作:
文件(非目录)名字–>硬件哈希4字MD5–>二次哈希到24位线性表相对指针字(二维单向链表首指针、粒度为页(8扇区))–>二维单向链表(横向为不同文件名字映射(首字相对指针next、为0结束),纵向为相同文件名字不同父目录路径单向链表相对指针(尾字相对指针next、为0结束))。
FNIT表单元格内容共4字:父目录路径inode号、vnode号,本路径(父目录路径+本FNIT名字)的inode号、vnode号。
16M项的二次哈希到24位H24T线性表hash24 table:每项为一个页首指针。页首字“不同文件名字映射”相对指针next(指向相同哈希项另一个不同文件名字映射页)、为0结束,页次字:16位相同文件名字项数(行号)、8位不同文件名字项数(列号),8位文件名字长度。之后是:文件名字以字粒度的字符串数组(最大64字),跟着是一项项FNIT表单元格内容(每项4字),如果不够装时、尾字相对指针next指向下一个页(继续安装FNIT表单元格)、为0结束。

3、据路径名pathname打开一个磁盘文件,系统内部会将这个过程分为六步:
比如打开:pathname = /home/user/ax/bx/cx/dx/ex/fx/gx/text文件
1)、分割pathname为父目录路径/home/user/ax/bx/cx/dx/ex

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值