资讯详情

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

空间管理员(1)AFS索引节点vfs_inode结构


文章目录

  • 空间管理员(1)AFS索引节点vfs_inode结构
  • 前言
  • 一、VFS(Virtual File System)虚拟文件系统
  • 二、VFS反映设备文件的索引节点对象由dev_inode结构表示,256字节。
  • 总结


前言

现实界: 无数相互作用和运动的物体在时空中不断创造和消亡,构成物体的最小物质单位是不朽、永恒运动、相互作用的元子(纯阳元子(单位正能量)、纯阴元子(单位负能量)、中元子)。同性元子相斥,异性元子相吸;一个纯阳元子和一个纯阴元子吸在一起,形成中性元子对(以下简称中元子)。中子,中微子,光子都是由许多元子组成;而正电子和负电子也是元子的容器,他们除了含有许多中元子外还含有纯阳或纯阴的元子。简单地说,一切都是五颜六色的元子容器 ,空间是万物的容器。空间是连续的,无限的,是三维的,各向同性的,空间可以用各向同性的坐标系统来识别。时间是物质运动过程的连续性和顺序,是永恒的;时间是连续的、单向的、均匀的,可以用均匀的计时系统来识别。质量是物体容器的基本属性之一。质量是物体容器中含有多少元子,没有质量小于或等于零的物质。能量是物质运动的状态属性,是元子的本性体现。宏观上,物质的能量有几种形式;物质中的能量可以以不同的形式相互转化,但总能量保持不变。多维变量可称为数学中的多维空间。物理学中有一维空间(线)、二维空间(面)和三维空间(体),现实中没有大于三维的物理空间。数学中的多维空间不能直接移植到物理学中;只有当维数小于或等于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接口将文件系统的通用操作与具体操作分开。VFS接口的实现可以在同一台机器上共存,允许访问已安装在当地的多种类型的文件系统。VFS以v节点为基础vfs_inode该结构包括一个数值标识符来表示位于整个网络范围内的唯一文件。支持网络文件系统的用于支持网络文件系统。保存每个活动节点(文件或目录)的内核vfs_inode结构,v(VFS)在内存中建立节点。不同类型的文件系统通过不同类型的文件系统file_operations方法表实现相应功能。 操作系统简单AOS的VFS定义的四种主要对象类型是:

超级块对象(superblock object)表示整个文件系统。     索引节点(index node)对象(vfs_inode object)I节点信息件或设备的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;	// 文件拥有者id
  u32 i_gid;	// 文件用户组id
  struct 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(数据块)数量d

标签: 传感器afs60b

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台