空间管理员(一)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/fx/gx/和文件text,
2)、通过PNVT表哈希,解析父目录路径/home/user/ax/bx/cx/dx/ex/fx/gx/、为每个目录名字快速寻找相应的vnode号,没有的(0xffff)则分配vnode号并安装相应的磁盘inode对象到v节点;如果其中有一项目录名字没有相应的inode节点号、则出错返回,父目录路径不允许没有建立的磁盘目录文件。最终将父目录路径~gx解析为相应的vnode号路径(目录名字以相应的vnode号代替)并安装相应的磁盘inode对象到v节点(磁盘I/O)。
3)、通过FNIT表哈希文件名字text(磁盘I/O),横向比较名字text字符串,找到相应列后、再纵向比较~gx的inode号和vnode号,最终找到相应FNIT表单元格。
4)、如果text文件还没建立、且须新建,则分配inode号和安装inode对象、同时也分配vnode号和安装inode对象到v节点,修改父目录文件内容(因增加了新的inode目录项)。
5)、如果text文件已经建立、已有inode号和inode对象,如果相应vnode号还没分配、则需要分配vnode号和安装inode对象到v节点。
6)、据text文件vnode对象信息,确定文件数据所在磁盘空间位置,读写操作…
如果说、比如ex是另一种文件系统(非AFS)的挂载根目录,那还需复杂的文件系统映射操作等等,这里不讨论了。
4、VFS在内存打开的索引节点对象由vfs_inode结构体表示、256字节。
VFS索引节点(index node)对象(vfs_inode object)表示一个单独的文件或设备的i节点信息(文件属性记录FAR),反映AFS磁盘文件体系时、可以说是磁盘空间的afs_inode在内存中的一个拷贝,其它文件体系类型则需要通过不同的方法表来实现其异构的磁盘i节点或模拟i节点到内存vfs_inode对象的映射建立操作。
AOS_V1.0.0版本:
struct vfs_inode { u32 i_ino; // 文件inode号。u16 i_version; // 文件系统标识或说版本号(AFS、ext3_i、msdos_i、 affs_i、等等)。u16 i_sversion; // 次文件版本号,或file_roll_no磁盘文件卷號。u32 i_flags; // i节点文件标志。union { // 字段u32,文件简单划分为2类:链接文件(源i节点号),非链接文件(也称源文件,小文件字节大小和链接计数)。struct nolink i_nolink; // 源文件(非链接文件)结构。 u32 i_sno; // 为链接Link文件时的源i节点号。};u32 i_name; // 磁盘空间文件名字哈希i节点映射表FNIT索引号。高8位FNIT表的列号,低24位FNIT表索引号。u16 i_rno; // FNIT表的行号 row numero(no)。得到i节点、就可据此得到FNIT表的单元格、从而文件名字等信息。u16 i_mode; // 文件类型和访问权限控制u32 i_uid; // 文件拥有者idu32 i_gid; // 文件用户组idstruct vnode i_vnode; // v节点信息结构、32字节。struct timestamps i_times; // 时间戳(Timestamps)字段结构、4*12字节。u32 i_dsb; // 文件磁盘空间数据区的缓冲页号 。union { // 磁盘文件数据块字段fdbf(file data block field)结构的联合体、140字节。u32 i_mfile[35]; // Micro file微型文件,文件数据内容最大140b,目录项(下属文件的i节点)数为最多35项的微型目录文件。u32 i_sfile[35]; // 小型文件Small File(带磁盘缓冲)结构,文件数据内容最大4Kb + 140b = 4236b。struct rfile i_rfile; // 根目录源文件Root source file(带磁盘缓冲)结构。struct lfile i_lfile; // 大型文件Large file(带磁盘缓冲)结构。};};
1)、i索引节点标志i_flags字段属性说明
i_flags.bit31 V_PNVT; // 1、v节点为目录或设备或固有系统文件,v节点名字在PNVT表。0、否,v节点名字在FNT表。
i_flags.bit30 I_MFILE; // 1、i节点为Micro file微型文件(链接Link文件也是),0、否。
i_flags.bit29 I_LINK; // 1、i节点为链接Link微型文件,0、否。
i_flags.bit28 I_DSBUF; // 1、i节点文件使用磁盘空间缓冲区Disk space buffer,0、否。
i_flags.bit27 I_DG; // 1、i节点文件内容为动态增长Dynamic growth的(通常按大型文件处理),0、i节点文件内容相对固定。
i_flags.bit26 I_LF; // 1、i节点文件为大型文件Large file,0、否。
i_flags.bit25 I_FSR; // 1、i节点文件为文件系统根目录文件File system root file,0、否。
i_flags.bit24 I_IF; // 1、i节点文件为不可变的文件Immutable file(不能修改、删除和更名),0、否。
i_flags.bit23 I_AOF; // 1、i节点文件为仅追加(append-only)的文件(只能把数据追加在文件尾),0、否。
i_flags.bit22 V_DEV; // 1、v节点文件为设备节点(磁盘空间中不存在),0、否。
i_flags.bit21 V_VDEV; // 1、v节点文件为虚拟设备节点(磁盘空间中不存在),0、否。
i_flags.bit20 I_VPID; // 1、v节点文件为虚拟进程设备节点(磁盘空间中不存在),0、否。
i_flags.bit19 I_MUTEX; // 1、i节点互斥锁定,0、否。
i_flags.bit18 I_IBUF; // 1、i节点缓冲区锁定inode buffer(对应磁盘空间缓冲区在内存中的缓冲区),0、否。
i_flags.bit17 V_VBUF; // 1、v节点缓冲区锁定vnode buffer,0、否。
i_flags.bit16 I_IDM; // 1、i节点数据变动(已修改、脏标志,需磁盘I/O更新)inode data movement,0、否。
i_flags.bit15 I_IBDM; // 1、i节点缓冲区数据变动inode buffer data movement,0、否。
i_flags.bit14 V_VBDM; // 1、v节点缓冲区数据变动vnode buffer data movement,0、否。
i_flags.bit13 I_DBTP; // 1、i节点为数据表文件时的数据项需要细分rwx权限,0、否。
i_flags.bit12 I_SYS; // 1、i节点文件为系统文件system file,0、否。对于系统文件root也没权限,只能由机器程序执行。
。。。待续
2)、文件类型和访问权限控制i_mode字段属性说明
i_mode.[15:12] f_types; // 文件类型File types。
#define F_UNKNOWN 0 //
#define F_REG 1 // 普通(常规)文件-
#define F_DIR 2 // 目录文件D
#define F_DBT 3 // 数据表文件T
#define F_LNK 4 // 链接Link微型文件L
#define F_EXECP 5 // 可执行程序executable programme文件E
#define F_CHR 6 // 字符设备文件C
#define F_BLK 7 // 块设备文件B
#define F_VDEV 8 // 虚拟设备virtual device文件V
#define F_SOCK 9 // Socket文件S
#define F_FIFO 10 // FIFO管道文件F
#define F_WHT 14 // 变换文件W
在刚安装完成的linux系统中,passwd配置文件已有很多帐号信息了,这些帐号是由系统自动创建的,他们是linux进程或部分服务程序正常工作所需要使用的账户,这些账户的最后一个字段的值一般为/sbin/nologin,表示该帐号不能用来登录linux系统。若要使某个用户账户不能登录linux,只需设置该用户所使用的shell为/sbin/nologin即可。比如,对于FTP 账户,一般只允许登录和访问FTP服务器,不允许登录linux操作系统。若要让某用户没有telnet权限,即不允许该用户利用telnet远程登录和访问linux操作系统,则设置该用户所使用的shell为/bin/true即可。若要让用户没有telnet和ftp登录权限,则可设置该用户的 shell为/bin/false。
人机界面管理员shell(外壳、人机交互、肺金)命令解释器,对unix而言shell只是一个用户进程。用户的登录名(账号)、加密后的密码、用户UID、所属组GID(GID=UID为默认主组,组用户列表(逗号分隔))、注释、用户主目录(登录后所居的初始目录,初始当前工作目录、继承其父进程,可用cd命令改变)、登录所用的shell、共7个字段一行(数据项)的数据表文件存放在/etc/passwd。AOS的账号名字哈希passwd(sys权限)数据表记录(2扇区256w)如下:(加密项除外)为其它用户可读,拥有者或sys才可修改(非拥有者时root也无奈)。
⚫ 用户的登录名(账号32b、主副组的组长)。拥有者或sys才可修改。
⚫ 组名称(组账号32b,或许是副组账号(副组记录)、看设置标志)。拥有者或sys才可修改。
⚫ 注释(32b)。拥有者或sys或root才可修改。
⚫ 用户u32 UID(主组GID)。sys系统自动分配、不能修改。
⚫ 设置标志字段 u32 UFLAGS。拥有者或sys或root(封禁用户登录、锁定等)才可修改。
⚫ 所属组的记录号数组u32 GIDRN[64],前32个成员为所属组的GID(0号为主组GID),后32个成员为所属组的记录号。所属组包含有主组、(副组+它方账号所建组)的附加组。拥有者或sys才可间接修改。拷贝于主组记录。
⚫ 用户或副组的主目录v节点号,或许需根据主目录名字哈希得到。拥有者或sys才可修改。
⚫ 登录所用的shell、1w。拥有者或sys才可修改。
⚫ 加密项结构(38字),拥有者或sys才可修改。
⚫ 账户密码的最小长度(5)、u4。
⚫ 组成员数、u28,拥有者或sys才可修改。
⚫ 组管理员位图列表(空值0、无组管理员)、u32,前32个成员UID列表中的一些可设为组管理员,权限:更改组密码和成员。拥有者或sys才可修改。
⚫ 超过120成员时的下一个扇区(126个成员、尾字next一个扇区)的单向链表磁盘空间指针、u64,拥有者或sys才可修改。
⚫ 指定用户的记录号。
⚫ 保留字段(空值)、1w,拥有者或sys才可修改。
⚫ 主组成员UID列表(最大120个成员),拥有者或sys才可修改。
加密项的字段如下:拥有者或sys才可修改。
⚫ 账户加密后的用户密码(如果为空,用户不需要输入密码即可登录)。
u16 [16],最大16字符。
⚫ 账户加密后的组密码。(如果为空,用户不需要输入密码即可登录)。
u16 [16],最大16字符。
⚫ 账户密码的最后一次修改时间(这是一个相对时间,即从1970年1月1日到修改时的天数),u32。
⚫ 账户密码最长有效天数(99999),u32。
⚫ 账户密码最短有效天数(7)、u32。
⚫ 账户密码过期前、提前警告的天数(7)、u32。
⚫ 账户密码在多少天后用户账户将被禁用(空值)、u32。
⚫ 账户密码被禁用的具体日期(这是一个相对时间,即从1970年1月1日到禁止时的天数)(空值)、u32。
⚫ 账户手机号、身份证号、用户邮箱、等等,c8 [64],64个ASCI码字符串数组。用户忘记密码时,sys的短信认证、允许用户重新修改密码,也或者第三方登录认证。
一个账户可以有多条记录(记录号Record number,最多16条),因为它可以创建多个副组,可以加入多个它方账号所建的组(最多31个附加组)。最多4G条记录、最多4G个账号,有主、副组2种类型的记录。一个用户可以有多个账号、属于多个组,一个组最多有16M个成员。passwd数据表文件为sys(机器)所有,所有用户权限为可读,root只是可以修改记录的设置标志字段 u32 UFLAGS、以封禁用户登录等等,数据表记录只能是相应的拥有者或sys才可修改。UID小于500的为系统用户,创建用户的时候系统会默认同时创建一个和这个用户名同名的组,这个组就是主组;在创建文件时,文件的所属组就是用户的主组。用户不论为主组还是附加组,就会拥有该组的组权限;一个用户可以属于多个附加组,但是一个用户只能有一个主组。用户在其主组下某个目录建立副组增加一条新记录:用户u32 UID(主组GID)、用户的登录名不变,但组名字可变、加密项、主目录、等等可变。
用户在其附加组(它方账号所建组)下新建某个新文件(或目录),其新文件(或目录)UID为进程的用户ID,其新文件(或目录)的组GID则为其所在目录的组ID。
文件名不可有“/”和“空符号\0”,…指代当前位置的父目录,文件所有者可以修改一个文件或目录的权限。修改权限可以使用chmod命令,也可以使用桌面环境的文件管理程序。
AOS权限说明:默认文件拥有者对其文件具有读r写w执行x权限,如果文件是一个“组目录”、则该组目录的拥有者或说创建者自动成为“组长”。组长通常可以创建32个组管理员(Group administrators),对组内的公用目录和文件或组长创建的文件具有相对较多的权限。任何情形下,一个文件的各种操作权限只能是文件拥有者(创建者)Owner才能修改(保护隐私),根用户root也不行!在一个文件组内、其权限顺序:sys、组长、组管理员、组内成员、其它用户,如果根用户root不在组内、只会看作是其它用户,但根用户root或许有删除该组的权限(但需经过“长老会(一些重量级系统管理员)决议”同意、呵呵)。当添加账户时,默认情况下会同时建立一个与用户同名且UID和GID相同的组(该用户自动成为该组组长),一个用户可以参
加多个组(最多32组)成为组管理员或组内成员。整个系统可看作一个根用户root组、其权限:sys、root、系统管理员、root组成员、其它用户(游客)。设备以及许多系统文件和公用文件的拥有者归属root,默认root组管理员或root组成员才有权限可修改其中的部分文件(这得由root安排),其它用户(游客)只能读其中的部分文件。AOS将会是“半公开”,以禁止root用户设置“后门”;权利源于民主,创建者(拥有者)才是上帝、而非root神。关于“特殊权限”的用途还在思考中。AOS将使用2次登录来保护隐私:第一次是系统登录(用户名(默认组名)、第一密码),登录进机器;第二次是用户组登录(用户名(组名)、第二密码),进入组内。
文件所有者(owner):拥有文件的用户,创建文件时是创建文件的用户。
组(group):文件所属的组,创建文件时用户的组。
其他人(other):既不是文件所有者,也不是文件所属的组的成员的其他用户。
权限 符号 值 对普通文件的作用 对目录的作用
读取 r 4 查看文件内容 列出目录中的文件(ls)
写入 w 2 修改文件内容 在目录中删除、添加或重命名文件(目录)
执行 x 1 文件可为程序执行 搜索、访问子目录及文件及shell中cd到此目录
i_mode.[11:0] 权限表示宏 含义
i_mode.bit0 S_IXGADM 组管理员执行权限
i_mode.bit1 S_IWGADM 组管理员写权限
i_mode.bit2 S_IRGADM 组管理员读权限
i_mode.bit3 S_IXGRP 同组用户执行权限
i_mode.bit4 S_IWGRP 同组用户写权限
i_mode.bit5 S_IRGRP 同组用户读权限
i_mode.bit6 S_IXOTH 其它用户执行权限
i_mode.bit7 S_IWOTH 其它用户写权限
i_mode.bit8 S_IROTH 其它用户读权限
i_mode.bit9 S_IXAPP 指定appoint用户执行权限。
i_mode.bit10 S_IWAPP 指定appoint用户写权限。
i_mode.bit11 S_IRAPP 指定appoint用户读权限。
// i_mode.bit9 S_ISVTX Sticky 位特殊权限,沾着位。
// i_mode.bit10 S_ISGID set-group-ID 位特殊权限。
// i_mode.bit11 S_ISUID set-user-ID 位特殊权限。
⚫r 表示具有读权限;w 表示具有写权限;x 表示具有执行权限;-表示无此权限。当进程每次对文件进行读、写、执行等操作时,内核就会对文件进行访问权限检查,以确定该进程对文件是否拥有相应的权限。而文件的权限检查就涉及到了文件的所有者(st_uid)、文件所属组(st_gid)以及其它用户,当然这里指的是从文件的角度来看;而对于进程来说,参与文件权限检查的是进程的有效用户、有效用户组以及进程的附属组用户。如何判断权限,首先要搞清楚该进程对于需要进行操作的文件来说是属于哪一类“角色”:
⚫ 如进程的用户ID等于文件指定用户ID,意味该进程以文件指定用户角色存在。
⚫ 如果进程的用户ID等于文件所有者 ID,意味该进程以文件所有者的角色存在。
⚫ 如果进程的用户 ID 并不等于文件所有者 ID,意味着该进程并不是文件所有者身份;但是进程的用户组 ID 或进程的附属组 ID 之一等于文件的组 ID,那么意味着该进程以文件所属组成员的角色存在,也就是文件所属组的同组用户成员(还有是否组管理员判断的流程)。
⚫ 如果进程的用户 ID 不等于文件所有者 ID、并且进程的用户组 ID 或进程的所有附属组 ID均不等于文件的组 ID,那么该进程以其它用户的角色存在。
⚫ 如果进程的用户 ID 等于 0(root 用户),则无需对设备和系统文件、公用文件进行权限检查,因为root是其拥有者。而root 用户组的系统管理员、组成员会有相应的一些限制(由root对这些文件做权限设置)。
AOS进程凭证:
⚫ 线程组ID(线程组号u16 tgid,进程的主线程号、组长),如果进程没有使用线程、则进程pid = tgid,线程号tpid(u16、最大64K线程)。
⚫ 多个独立进程可以合并成进程组PGID,几个进程组有可以合并成一个会话(session),会话中的所有进程有同样的会话ID。
⚫ 线程ID、进程ID、用户ID、会话ID、等等,为sys自动分配的资源、所有用户都无法更改,可以读取。
⚫ AOS取消有效用户UID和GID,取消set_user_ID(SUID)、set_group_ID(SGID),取消FSUID和FSGID。当用户名和密码正确时、可以重新修改其对应的用户名和新密码(sys哈希阵列单元分配记录指针、拷贝组用户列表等)。因为数据库表文件可以是权限细分到数据表记录的某个字段或项上(一旦数据库表文件权限细分标志成立,只有相应用户可以修改。passwd默认是细分、拥有者sys所有,在读写数据项的某个字段时root也无奈)。
⚫ 用户UID、GID:登陆完成后shell从相应密码文件passwd获取(比对登录名和密码),此后创建的进程将从父进程中继承这些ID。
⚫ 附加组ID:标识进程所属的其它组,新进程从父进程处继承,shell从相应组文件、密码文件等获取。
3)、链接Link文件字段属性说明
文件简单划分为2类:链接文件(字段是u32源i节点号),非链接文件(也称源文件,字段是u16小文件大小和u16链接计数)。AOS的链接Link文件可以是跨文件系统跨网络的链接到全世界的不同机器上,是一种文件内容就在i节点内的Micro file微型文件;u32 i_mfile[35]数组可表示16级目录深度,网络机器级使用19字(76b字节) ,网络机器级19字+本地最大16级目录深度 。
struct nolink { // 源文件(非链接文件)结构。u16 i_fbytes; // 字节表示的小文件大小。u16 i_nlink; // 源文件(非链接文件)被链接的计数
};
4)、小型文件Small File(带磁盘缓冲)结构字段属性说明
Micro file微型文件是一种文件内容就在i节点内的文件,文件数据内容最大140b;小型文件相比微型文件多一个磁盘空间缓冲区Disk space buffer,文件数据内容最大4Kb + 140b = 4236b。目录文件是一种数据表文件,表项 = 目录项 = 所包含的相应文件i节点号。微型目录文件的目录项数(下属文件的i节点)最多35项,小型目录文件的目录项数(下属文件的i节点)最多1059项(1k+36)。
磁盘文件按大小分有三类:微型文件(文件内容最大140b,如符号链接Link文件,或者目录项数最多35项的微型目录文件),小型文件(文件内容最大
4Kb + 140b = 4236b,如小型目录文件(最大有1059个目录项)),大型文件(文件内容最大约16Eb )。
5)、 根目录源文件Root source file(带磁盘缓冲)结构字段属性说明
打开一个文件,必定是其对应文件系统根目录文件也被打开,因为哪里才会有对其统属文件目录操控的方法。根目录文件的节点数(目录项数)不适宜过多,带磁盘缓冲时、可支持到1K项以上,AFS的文件系统根目录也是AOS系统根目录、不带磁盘缓冲,最多有24个目录项数。AFS的文件系统根目录(10多个目录项):
/dev 用于存放设备文件。
/proc 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/bin 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。
/etc 存放系统管理和配置文件。
/home 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示。
/usr 用于存放系统应用程序,比较重要的目录/usr/local 本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。/usr/x11r6 存放x window的目录。/usr/bin 众多的应用程序 。 /usr/sbin 超级用户的一些管理程序。 /usr/doc AOS文档 。/usr/include AOS下开发和编译应用程序所需要的头文件。 /usr/lib 常用的动态链接库和软件包的配置文件。 /usr/man 帮助文档。 /usr/src 源代码,AOS内核的源代码就放在/usr/src/aos里。 /usr/local/bin 本地增加的命令。 /usr/local/lib 本地增加的库。
/opt 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里。
/root 超级用户(系统管理员)的主目录(特权阶级^o^)。
/sbin 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等。
/mnt 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统。
/boot 存放用于系统引导时使用的各种文件。
/lib 存放根文件系统中的程序运行所需要的共享库(动态链接共享库)及内核模块。共享库作用类似windows里的.dll文件。/lib/modules 目录包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引导系统所需的模块(例如网络和文件系统驱动)。
/tmp 用于存放各种临时文件,是公用的临时文件存储点。
/var 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件根(系统启动日志根)。
/lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。
struct rfile { // 根目录源文件结构。u32 i_state; // inode状态,可以是I_NEW,I_LOCK,I_FREEING等。u32 i_rdev; // 磁盘文件系统相关的块设备编号,设备驱动在i_rdev所指的设备v节点内。在磁盘空间。u32 i_sbno; // 相关的超级块文件i节点号。在磁盘空间。const struct inode_operations *i_op; // i节点操作方法表32位相对指针,方法库包含在超级块文件内。在磁盘空间。struct vnode_operations *i_vop; // v节点信息结构操作方法表32位相对指针。在磁盘空间。struct file_operations *i_fop; // 文件操作方法表32位相对指针,default_file_ops。在磁盘空间。/* 在内存空间v节点中打开时的相应参数,磁盘上无意义(可视为随机数),文件系统的根目录私有数据区。*/u32 v_rdev; // 相关块设备的v节点号。u32 v_sbno; // 相关的超级块文件v节点号。const struct inode_operations v_op; // 内存打开的索引节点操作方法表号。struct vnode_operations v_vop; // 内存打开的v节点信息结构操作方法表号。struct file_operations v_fop; // 内存打开的文件操作方法表号。u32 i_rent[24]; // 根目录项Root Entry的v节点数组。
};
6)、大型文件Large file(带磁盘缓冲)结构字段属性说明
⚫ 全局磁盘GDPT( Global Disk PartitionTable全局硬盘分区表 )用64位整数来表示扇区号LBA(小端格式,扇区地址、逻辑块地址Logical Block Address),如考虑无需移位等复杂操作,那最低半字为扇区号(1章 = 64K个扇区)、低半字为章号
(1db数据块 = 64K章)、中半字为数据块号(1bdb大数据块 = 64k db)、高半字为大数据块号(1卷rl (roll)= 64K bdb)、是最适宜不过。
⚫ 这样,1卷 = 一个全局磁盘GDPT、而不再分区(或说只分一个区);一个系统可带64K个全局磁盘GDPT,1卷rl (roll)= 4G4G512b = 8 Zb。一个分区一个卷,每卷最大文件数4G个。支持的最大文件为16 Eb(64位)(文件只能在一个卷内,而一个卷rl (roll)= 64K bdb = 8 Zb,还需有超级数据块、DPT分区表等的预留)。
⚫ 64位文件磁盘地址:
bdb(7位).db(16位).c(16位).ps(page(13) + sector(3)).offset(9位)。
64位文件磁盘地址空间的“点地址” :
db(16位).c(16位).ps(16位).(bdb + offset)(16位) = db.c.ps.bo。
1c(章chapters)= 64Ks(扇区sector) = 1Mr(行row)= 8Mw(字word)= 16Mz(半字z)= 32Mb(字节byte)= 256Mbit(位bit)。
1db( data block 数据块) = 64Kc章 = 4Gs(扇区sector) = 512Gw(字word)= 1Tz(半字z)= 2Tb(字节byte)= 16Tbit(位bit)。
1bdb(big data block 大数据块) = 64K db( data block 数据块) = 4Gc章 = 256Ts(扇区sector) = 32Pw(字word)= 128Pb(字节byte)。
1卷rl (roll)= 64K bdb = 4G db = 256Tc = 16Es(扇区sector) = 2Zw(字word)= 8Zb(字节byte)。
磁盘空间分配有:连续大数据块、连续数据块、连续章、连续页(1页page为8个扇区4Kb)。
1 Kb ( Kilobyte 千字节 ) =1024b,1024 = 2^10 ( 2的10次方);
1 Mb ( Megabyte 兆字节、简称“兆”) = 1024 Kb,
1Gb ( Gigabyte 吉字节、又称“千兆”) = 1024 Mb,
1 Tb ( Trillionbyte 万亿字节、太字节 ) = 1024 Gb,
1 Pb(Petabyte 千万亿字节、拍字节)= 1024 Tb,
1Eb(Exabyte 百亿亿字节、艾字节)= 1024 Pb;
1 Zb ( Zettabyte 十万亿亿字节、 泽字节 ) = 1024 Eb,
1 Yb (Yottabyte 一亿亿亿字节、 尧字节 ) = 1024 Zb,
1 Bb ( Brontobyte 一千亿亿亿字节 ) = 1024 Yb。
struct lfile { // 大型文件Large file(带磁盘缓冲)结构。u32 i_blocks; // 文件数据块的数量。
/* 有一个以上bdb,高16位表示连续bdb(大数据块)数量bdbs,低16位表示连续db(数据块)数量dbs是从最后一个bdb开始的。若bdbs=0,连续db数量是开始于一个bdb內的任一db位置。*/ u32 i_sectors; // 文件扇区或页的数量。
/* 如果bdbs=dbs=0,文件不到一个数据块。高16位表示某一个数据块内连续簇(簇cluster)数量,低16位表示连续s(扇区sector)数量是最后一个c开始的。若cs=0,连续s数是开始于一个c內的任一s位置。如果文件大小是小于等于8个扇区,则文件内容放入“文件数据区线性表(每项1页4Kb、8扇区)”。磁盘IO最少一次读或写8个连续扇区(1页为8个扇区4Kb、磁盘空间分配的最小粒度,LBA最低3位是0)。*/ u32 res; // 暂时备用reserve。u64 i_blockp[16]; // 数据块指针数组Pointers to blocks ,数据块的第一个双字(64位)是长度值。
};
若16个数据块指针不够力,还有4Kb的磁盘缓冲区做数据块指针。
7)、时间戳(Timestamps)48字节结构字段属性说明
⚫struct timespec96、96位结构变量:高64位表示正负秒数,它们以1970年1月1日(unix元年)表示为0,正数表示之后至今的秒数,最大表示约2147.5亿年;负数表示之前的秒数,最小表示约负2147.5亿年。低32位的单位是纳秒(毫微秒(nanosecond),上一秒开始经过的ns数)。
struct timestamps { // 时间戳(Timestamps)字段结构、4*12字节。struct timespec96 i_atime; // 文件的最后访问(access)时间。struct timespec96 i_mtime; // 文件内容的最后修改(modify)时间。struct timespec96 i_ctime; // 文件inode属性的最后改变(change)时间。struct timespec96 i_crtime; // 文件的最初创建(create)时间。
};
8)、v节点信息结构32字节字段属性说明
v节点信息结构是在内存空间v节点中打开时的相应参数,磁盘上无意义(可视为随机数)。
struct vnode { // v节点信息结构32字节字段。u32 v_no; // 本v节点号。u32 v_pno; // 所属父parent目录的v节点号。u16 v_count; // 引用记数。u16 v_wcount; // 写者记数或其它参数。u32 v_name; // v节点的FNT表文件名字索引或PNVT表设备目录名字索引,从FNIT表中寻找到的文件名字是安装到FNT文件目录名字表。u32 v_pbuf; // 对应文件磁盘空间数据区的物理内存缓冲页(1页8扇区) 。或设备第二缓冲区起始页号。u32 v_fpbuf; // 文件用户物理内存缓冲页(1页8扇区) 。或设备第三缓冲区起始页号。u32 file_vma_no;// 文件打开表fot的项号、指向file_vma的流容器对象。文件磁盘空间或设备空间到FVO流容器对象的窗口映射。u32 v_ops; // v节点的方法表号(窗口映射方法表集)。
};
二、VFS反映设备文件的索引节点对象由dev_inode结构体表示、256字节。
设备视为AFS内存/dev中的一个设备根目录节点。设备的拥有者为sys系统和根用户root或用户进程,v节点部分字段是sys或说机器自动读写操作,另一部分root用户或用户进程可以读写操作(看设备的所属),其它用户可以读和应用。设备文件的时间戳(Timestamps)只是24字节,使用 d_atime和d_crtime。设备可以视作在内存中存在的文件内容就在v节点内的Micro file微型内存文件。/dev下的所有目录树设备v节点结构,形成一个统一的磁盘数据表文件dev.dbt(其inode号= vnode号 = 4k),主设备数最多4k个、AOS系统的主设备数通常是最多100多个,大部分主设备号留给用户进程使用。AOS的设备号分配如下:
u12 major; // 主设备号
u20 minor; // 次设备号
对于设备节点来说,名字不是重要的,设备号才是最重要的。主设备号用来区分不同种类的设备和关联到相应的设备驱动程序,而次设备号用来区分同一类型的多个设备。一个系统大多是几十个设备类和几种文件系统,冲顶也就100多个;简易AOS追求的是“高性能(超越windows和linux)、小的源代码量(小于3千行)”,不可能去编写几千个设备驱动程序、AOS使用100多个主设备号已经足够,其它主设备号是留给用户程序使用的;一个NTCP或TCP/IP虚拟设备类(主设备号),同时动态支持千万多个NTCP或TCP/IP“虚拟连接”设备文件打开号倒是可以的。其实设备驱动程序的编写是生长厂家的事情(提供一个设备及驱动文件),这里给出的只是简单、高效、高性能的实现框架。提供2条:依据权限而对v节点的各种字段属性直接或指针间接(v节点的各种表的字段)读写操作方法,大幅度减少设备驱动及内核的代码量。一些设备是资源分配“辅助”设备(如中断控制器 (NVIC)、外部中断和事件控制器 (EXTI)、DMA配置、IO引脚复用配置、IO引脚电气特性配置、系统配置控制器 (SYSCFG)、站管理接口SMI、时钟控制 (RCC),等等设备),没有file_operations等方法表、只是使用这2条公用操作方法来实现。
进程mm和进程号对应的v节点号在同一个64k范围内,只需16位的相对v节点号,前面32k个v节点号分给进程、后面的32k个v节点号分给进程mm结构。主设备对应的v节点号在另外的64k范围内。
inode号 = vnode号 = 0为AFS文件系统根、也是AOS系统根目录。
struct dev_inode { // 设备v节点树结构。设备父v节点--设备v节点--设备子节点。u32 d_cno; // 子child设备的v节点号。u32 d_version; // 设备号标识(高12位主设备号major、标识设备驱动程序号,低20位次设备号minor)。u32 d_flags; // 设备标志。不同设备的定义会有区别。u32 d_state; // 设备状态。类似设备树的status 属性。u32 d_start; // 设备寄存器的物理内存页开始地址。类似设备树的reg 属性、ranges 属性和compatible 属性。u16 d_len; // 设备寄存器的16位内存映射地址长度(有多少个字或字节)。u16 d_mode; // 文件类型和设备模式(低12位设备属性、类似设备树的model 属性)。u16 d_class; // 设备类型。设备挂在其父节点(设备类)下,cdev字符设备大类、bdev块设备大类、sdev网络socket设备、64大类高6位。u16 d_bus; // 设备总线的类型(bus_type),可以挂载许多设备、可以使用很多设备驱动,每一个驱动程序可以管理一组设备。u32 d_fno; // 相关联的磁盘文件v节点号。struct dev_vnode d_vnode; // 设备v节点信息结构、32字节。struct dtimestamps d_times; // 设备时间戳(Timestamps)字段结构、2*12字节。struct xdev d_xpdata; // 不同设备的特殊私有数据区、2*12字节。u32 d_pbuf; // 设备缓冲区页(1页8扇区4kb) ,设备第一缓冲区页。u32 d_pdata[35]; // 设备私有device private数据区、140字节。
};struct dev_vnode { // 设备v节点信息结构32字节字段。u32 d_no; // 本设备v节点号。u32 d_pno; // 所属父设备parent目录的v节点号。u16 d_count; // 引用记数。u16 d_wcount; // 写者记数或其它参数。u32 d_name; // 设备v节点的PNVT表设备目录名字索引。u32 d_pbuf; // 设备第二缓冲区起始页号。u32 d_fpbuf; // 设备第三缓冲区起始页号。u32 file_vma_no; // 设备空间到FVO流容器对象的窗口映射。u32 d_ops; // 设备v节点的方法表号(窗口映射方法表集)。
};
文件磁盘空间关联到(窗口映射)用户进程虚拟内存地址空间的file_vma对象的FVO流容器对象,FVO流容器对象为虚拟内存连续页地址、需通过页表集(PGD、PUD、PMD、PET、)关联到(正向映射)物理内存连续页地址;用户进程代码操作的是虚拟内存地址空间,而内核代码操作的是物理地址;缓冲区页、v节点、等等,为内核操作的都是物理内存地址;设备空间v节点通过file_vma_no、d_fno也可以反向关联到磁盘文件v节点、file_vma对象,从而关联到文件磁盘空间。
物理内存地址空间到虚拟内存地址空间的映射存在多种可能:
a、直接映射:物理内存页到内核虚拟内存地址空间页的固定反向映射,总是存在的、用户进程只能通过相关内核虚拟内存地址读。
b、共享映射:物理内存页到内核虚拟内存地址空间的KVMA对象区域或file_vma对象区域的页共享反向映射,多个相关进程可以操作这些对象。
c、私有映射:物理内存页到用户进程虚拟内存地址空间的PVMA对象区域或file_pvma对象区域的私有反向映射,相应用户进程可以操作这些私有对象。
总结
前路漫漫,吃喝玩乐不能停!。