返回列表 发帖

[转帖]FCES - 一种全新的分区文件系统结构

自由簇规范执行标准 Free Cluster Executive Standard [FCES] 1、使用权利和义务的规定 1、定义、内容和通用准则 本规定[使用权利和义务的规定,下同]是您[包括任何组织和个人,下同]与开发组成员[开发组成员资料集中包含的所有核心开发者和修改者,下同]之间订立的通用准则,仅当您使用[包括查阅、修改、发布以及用程序语言实现,详细参阅本部分的以下内容]本规范[包括当前和以后任何版本的修改稿,下同]以及之后,并因此产生任何对您和[或]开发组成员的影响时生效。只有当您认可本规定订立的所有规则之后,方可以正式使用本规范所包含的技术。如果对此有任何疑义,请致询开发组成员。如有任何异议,请不要使用本规范。并敬请删除您所拥有的所有本规范的副本。 本规定将主要包括以下几个部分 1、关于免费使用范围的规定 2、关于有偿使用范围的规定 3、关于有偿使用者的权利和义务的规定 4、关于违反本规定之前规则的惩罚 本规定之后将逐一阐述上述的内容,对于本规定中可能存在的遗漏和错误,将在以后的修改中添加和修正,恕不另行通知。本规定的最终解释权归开发组成员,且对本规定的解释必须获得所有核心开发者和超过2/3的修改者认可。 通用准则 1、规范开发组成员申请法律保护的准则 以下提及的任何准许的法律保护,如果没有特殊说明,均不得以妨碍其它规范开发组成员申诉为代价。具体法律保护程序及最终保护权利,视所在地的法律规定。 2、开发组认可的准则 以下提及的任何的开发组认可,如果没有特殊说明,均是指获得所有核心开发者和超过2/3的修改者的认可。 2、免费使用范围 1、无偿原则 任何个人和组织可以在无偿的原则上查阅、修改、发布以及用程序语言实现[包括汇编及高级语言]本规范。但任何的使用都不可以妨碍他人使用作为代价。 2、对于修改、发布和用程序语言实现的额外要求 对本标准的无条件修改限于第二部分[规范明细]中的分区结构、文件系统处理等。第一部分[使用权利和义务的规定]及第三部分[开发组成员资料集]不允许随意修改。但是参与修改的个人或组织,可以在第三部分中的[修改组资料集]中添加和修改自己的资料,但必须告知所有核心开发者方可认为生效。经所有核心开发者同意后,可以将提供重大修改意见的修改者加入核心开发组资料集,从而成为核心开发者。如果需要修改第一部分[使用权利和义务的规定]或第三部分[开发组成员资料集]中不属于自己的资料,则必须将修改意见告知所有开发组成员,并且获得开发组认可,方可按照认可的修改意见加以改动。 对于本规范的发布要求完整的发布全文,特别不得在发布中任意删减第一部分[使用权利和义务的规定]或第三部分[开发组成员资料集]。 对于在免费使用前提下,使用程序语言实现本规范或任何版本的修改稿的个人或组织,要求所开发的程序不得以盈利作为目的发布。如需要带有赢利性质的使用本规范,请参阅以下的有偿使用范围。 3、有偿使用范围 1、有偿原则 有偿使用本规范,只限于使用程序语言实现[包括汇编及高级语言]。并且不可以妨碍他人使用作为代价。即本规范完全共享,永不出售给任何组织和个人。对于有偿使用本规范的个人或组织,只拥有使用本规范或某一版本的修改稿中所包含的技术开发,并将完成开发的程序有偿出售、出租给第三方的权利。 2、有偿使用限制 1、提供有偿使用方式 任何组织和个人都有提出有偿使用的要求,但必须告知所有开发组成员,签订相关书面协议,并且协议获得开发组认可后,方可正式开始有偿开发和将完成的程序出售、出租给第三方等的盈利商业活动。并且有偿使用权利仅限于此,有偿使用方没有将有偿使用权转让的权利。如果存在未获得认可就加以有偿使用,和[或]转让有偿使用权的情况,规范开发组的任何成员都有权独立或联名申述侵权和[或]申请相关的法律保护。 2、时间限制 规范开发方有权在书面和口头协议中提出有偿使用的时间限制。订立的有偿使用时间限制需要经过开发组认可。有偿使用方可以对订立的限制时间提出质疑,并要求规范开发组重新订立限制时间。但具体修改仍视规范开发组。 有偿使用方若存在超期限使用的,规范开发方的任何成员都有权独立或 联名申述违约和[或]申请相关的法律保护。 4、对于违反本规范使用权利和义务的惩罚 本部分[本规范使用权利和义务]是强制性的准则,对任何个人和组织有效,并且包括任何开发组成员。 1、对非开发组成员的违规使用或违约等的处理方式 对非开发组成员的违规使用[包括有偿和无偿使用]或违约等的处理方式遵循本部分以前两节[免费使用范围]和[有偿使用范围]中的相关规定。 2、对开发组成员的违规使用等的处理方式 1、开发组成员违规的定义 开发组成员违规包括,某一个、或多个开发组成员联合,违反了前两节[免费使用范围]和[有偿使用规范]中的规定,包括在违反了第三节[有偿使用范围]中相关程序的情况下,将本规范的有偿使用权出售、转让或出租,以及用任何盈利或不盈利方式提供给第三方进行有偿开发。或者在获知存在其他组织或个人违规的情况下,未及时告知其他开发组成员,和[或]故意向其他开发组成员隐瞒,并因此造成其他开发组成员利益的损害。以及任何与本规定之前规则矛盾的使用、转让、出租和出售等行为。 2、对开发组成员的违规使用等的处理方式 如果一个或多个开发组成员涉及上述的违规行为,其余的开发组成员可以独立或联名申诉侵权和[或]申请相关的法律保护。如经合法裁定或判决确认其违背并侵害了其余的开发组成员的利益,则在法律保护以外,经过开发组认可,可以将违规的开发组成员降级或者除名。具体包括,从核心开发组成员降级至修改组成员或从开发组成员中除名,以及将修改组成员从开发组成员中除名。 2、规范明细: 1、本规范涵盖内容 本规范不包含对MBR[主引导记录]和PBS[分区启动区]部分的修改。前者不属于此规范所需要处理的内容,后者因与具体的操作系统相关,尚未被处理。 本规范仅包含信息存储部分的内容,对应于传统FAT文件系统的BPB[基础参数区]、FAT[文件分配表]及其后的部分。 2、基于当前硬盘规范的设定 1、扇区与数据存储的基本方式 当前的主流硬盘系统都是以扇区作为最小的存取单元。本规范遵循此标准,即所有的数据存取工作均是以扇区为单位。且根据通行的512字节作为一个扇区,但大多数的规范操作内容不依赖于扇区的大小,可能存在的个别情况将被特别标注或加以详细说明。 2、接口与传输规范 本规范中不涉及此类的问题,本规范的设计将不依赖于硬盘的物理接口以及传输规范。 3、MBR中的分区信息 为与其它类型的分区加以区别,定义在MBR中的FCES分区类型为90H。其余分区信息依赖于特定的硬件系统,如起始和终止头、柱面和扇区信息。 为了描述的方便,现约定假设存在一个FCES分区从0盘面0柱面1扇区起。 4、分区的主要分配和组成方式 除去PBS[分区启动区]外,FCES分区将包含以下的三部分。 1、分区基础属性区[BPB] 2、索引记录区[IRB] 3、数据记录区[DRB] 5、分区基础属性区详细 1、区域主要功能 与FAT文件系统中的BPB[基础参数区]功能相近。记录分区的基本属性,用于初始化相应的系统保留内存,供后期对文件和路径的组织访问和修改使用。将在以下的属性列表中说明各属性的独立作用。 2、区域位置 在PBS[分区启动区]后,即起始扇区后一柱面的第一个扇区开始[0盘面1柱面1扇区],最多扩展至后24个扇区[0盘面1柱面24扇区]。 3、基础属性表 功能说明 扇区编号 区内偏移量 区块长度 演示值 BPB长度 0x02 0x0000 Byte 0x02 索引长度 0x02 0x0001 Byte 0x04 字符名长度 0x02 0x0002 Word 0x00FF 地址指针长度 0x02 0x0004 Byte 0x08 卷序列号 0x02 0x0025 16 Bytes ‘1ACEFK..’ 4、基础属性详细说明 这个部分是FCES正常工作所需要的最基本信息,这四个值不依赖于版本,但整个基础属性表将可能被扩充。索引长度和地址指针长度一般依照于硬盘的物理性质进行设定,BPB长度和字符名长度依照用户或操作系统的规定进行设定。通常情况下,对基础属性表的修改会被限制在一个较高权限要求之下,或者不允许修改。因为根据FCES,对此的任何修改将可能造成对整个分区的无法存取。但这种问题可以通过对此表的修改而解决。[详见逻辑数据损坏处理中的说明] 1、BPB长度 记录基础属性区所占用的扇区数,以便于扩展。 2、索引长度 记录索引记录区中独立的文件或目录的索引号所占用的字节数,最大为255。根据文件与目录索引区分方法[详见索引记录区中的说明],约将可以容纳256^255/2个文件以及256^255/2个目录。[不排除部分系统保留文件索引号。] 3、字符名长度 记录索引记录区中独立的文件或目录的字符串名称的最大长度。最大为65535,即可以使用65535个字节长度的字符串标注一个目录或文件。 4、地址指针长度 记录索引记录区中和任一自由簇前后的地址指针所占用的字节数。 5、卷序列号 此序列号作为对卷索引的唯一标示,若存在多个FCES分区,则不允许此卷序列号重复。一般应由分区程序自动生成并写入基础属性表。无须最终用户或客户程序管理。 5、扩展属性表 区内偏移量均以演示值计算。 功能说明 扇区编号 区内偏移量 区块长度 演示值 扩展标示 0x02 0x0015 32 Bytes ‘FCES.BASIC’ 卷标 0x02 0x0035 32 Bytes ‘User Disk’ 用户个数 0x02 0x0055 Byte 0x06 用户名列表 0x02 0x0056 每个16 Words 最大 4032 Bytes ‘User1..’ 类型个数 0x02 0x0116 Byte 0x10 类型名列表 0x02-0x03 0x0117 每个16 Words 最大 8192 Bytes ‘Hidden..’ 路径分隔符 0x03 0x0117 Word ‘\’ 6、扩展属性详细说明 这个部分是FCES扩展功能实现所需要的信息,基于FCES的不同版本和发展将可能会有较大的改动和扩充。其中的信息均为连续存储,忽略扇区终止符。 1、扩展标示 说明此扩展属性表的标示信息,用于支持系统确认是否可以实现全部的扩展功能,和[或]跳过其中某些不支持的扩展功能。 2、卷标 用于最终用户对此分区的说明,此说明同时也可成为此分区根目录的字符串标示。 3、用户个数 记录整个分区将可能被多少个用户同时或同时段使用[包括尚未注册但预留记录空间的用户],最大为127,即允许最多127个用户对分区进行可能包括受限的读写访问。 4、用户名列表 记录所有注册用户的用户名,并预留下记录空间供未注册的用户。根据用户名的前后顺序进行排序和设立用户编号。用户编号将用于文件的用户访问权限以及加密确认校验。编号0x00的用户为共享用户,不存在编号为0x80的用户[详见索引记录区中的说明]。不存在可以访问任何用户文件的超限级用户。 在索引记录区中,用户所属的文件的索引记录中将包含用户编号,从而成为一种不依赖于绝对或相对路径的文件组织形式和搜索方法。[详见索引记录中的说明] 5、类型个数 记录整个分区中存在的所有文件类型的总个数,如早期的[只读]、[存档]等。对于一个FCES分区,所支持的文件类型最多为256个[包括未登记但预留记录空间的类型]。类型个数应为8的倍数,以保证存储空间的有效利用[详见索引记录中的说明]。可能根据支持系统的不同,其中的某些会被作为缺省类型而不可以被更名或删除。 6、类型名列表 记录所有已登记类型的字符名称,并预留下记录空间供未登记的类型。根据类型名的前后顺序进行排序和设立编号,用于对文件进行不依赖于绝对或相对路径的组织和搜索。[详见索引记录中的说明] 同时,类型名还可以用于定义不同级别的文件误删除和误修改保护。 7、路径分隔符 记录用于绝对或相对路径显示时的路径层分隔符号,以适应不同的自然语言中对路径层分隔符号在习惯上的不同。因在FCES分区中文件或目录名称只是简单的符号标记,因此可能出现路径分隔符和文件或目录名称中的符号重复,而无法区分的问题。所以根据支持系统的不同,可能会不允许此分隔符出现在文件或目录名称中,和[或]限制对此符号的修改。 6、索引记录区详细 1、区域主要功能 记录文件和目录的用户权限、加密确认校验、字符名称、类型、创建[或修改]时间。同时记录文件和目录、目录和目录的从属关系,以及文件的起始扇区编号。 2、区域位置 由分区最后一个扇区开始反向记录,以保证存储空间能够得到完全的利用。 3、区域结构 索引记录区由若干个独立的索引记录组成,每个索引记录记录一个文件或目录的信息。每个索引记录一般占用1个扇区的存储空间[视基础属性表中的设定,将在以下内容中详细说明。],若字符名称长度超过467Bytes则独立于第二之后的扇区。对于目录,不记录文件起始扇区的编号,即相应位置空置。 索引记录的排列依照索引编号的顺序。对于一个已经被设定过基础和扩展属性表的分区而言,任意一条索引记录所占用的扇区数将被固定,这样通过索引编号与每条索引记录占用的扇区数就可以直接定位任意一条索引记录的位置,从而提高文件和目录检索的速度。 4、单独索引记录结构表 采用相对扇区编号,即 [0x01]表示此索引记录中的第一记录扇区。 区内偏移量以及区块长度均以基础属性表和扩展属性表中的演示值为准。 以文件的索引记录为例,且仅为演示,无实际意义,下同。 功能说明 扇区编号 区内偏移量 区块长度 演示值 检查使用标记 0x01 0x0000 Byte 0xFF 用户编号 0x01 0x0001 Byte 0x81 索引编号 0x01 0x0002 DWord 0x0001000A 父目录索引编号 0x01 0x0006 DWord 0x8000010B 类型编号 0x01 0x000A Word 0xAC 创建[修改]时间 0x01 0x000C 5 Bytes 0x1F54420000 字符名称 0x01 0x0011 256 Bytes ‘UserFile1.txt..’ 起始扇区编号 0x01 0x0267 8 Bytes 略 5、单独索引记录详细说明 1、检查使用标记 记录此索引记录区域是否已被使用,如果未被使用或隶属文件或目录已被删除,则标记为0x00,否则标记为0xFF。 2、用户编号 由8位的2进制数组成。其中后7字位组成的数与此用户在扩展属性表中的顺序编号相同。第一位为加密确认校验位。1表示此文件的全部数据经过加密处理[包括此条索引记录中余下的部分],直接获取的数据与真实数据不同。0表示没有经过加密处理。 如演示值中的81H=10000001B,表示此文件是编号为1的用户的加密文件。此位对目录同样有效,因为索引与父目录索引编号同样被密码保护,所以从属于此目录的所有目录和文件,无视加密与否同样无法在以目录方式检索时被获取。 3、索引编号 具体长度依赖于基础属性表中关于索引占用字节数的记录。是文件或目录在整个文件系统中的唯一标号,用于对文件和目录以及之间的从属关系的检索。索引编号的分配依赖于支持的操作系统,无须最终用户或客户程序管理。[详见操作系统的索引编号管理和分配] 依演示值,索引编号由32位的2进制数组成,分为2个部分。第一部分是文件和目录的区分位,占用1字位。0表示为文件,需要在存取文件时读取随后的起始扇区编号。1表示为目录,不存在起始扇区编号。后31位为剩余编号位。定义0x80000000为分区根目录,定义0x00000000的文件为未使用索引编号表记录文件[详见操作系统的索引编号管理和分配中的说明]。 4、父目录索引编号 FCES使用相对目录管理文件和目录的从属关系,即不记录下全部的目录树结构,而只是通过记录相对路径关系来形成完整的目录树结构。 [这样虽然可以提高索引编号检索、相对路径检索以及修改绝对和相对路径的速度,但是却可能造成目录文件从属关系检索时的迟钝。因为如果需要检索一个目录下属的所有文件和目录,则必须检索整个索引记录区。为此,可能需要加以修改。] 父目录索引编号就是此文件或目录所属目录的索引编号。依演示值,如果索引编号为0x80000000,则表示此文件或目录从属于分区根目录。 5、类型编号 记录此目录或文件所具有的类型,其占用字节数为扩展属性表中分区的[类型个数]/8。每一位2进制数表示一种类型,其排列顺序与类型在类型名列表中的编号顺序一致。为设置为1时,表示此目录或文件拥有此种类型。否则,设置为0。 如演示值,ACH=10101100B,表示此文件拥有编号为1、3、5、6的类型。 6、创建/修改时间 记录此文件或目录的创建或最后一次修改的时间。整个记录分为6个部分,分别为年、月、日和时、分、秒。2进制分段表如下: 功能说明 2进制位偏移量 区块长度 演示值 年 0x0000 14字位 00011111010101B 月 0x000E 4字位 0001B 日 0x0012 5字位 00001B 时 0x0017 5字位 00000B 分 0x001C 6字位 000000B 秒 0x0022 6字位 000000B 如演示值0x1F54420000,表示2005年1月1日0时0分0秒。 7、字符名称 记录目录或文件到字符名称,这个名称只作为最终用户对其中信息的一个简要描述,可用于文件名检索,但并没有区分不同目录和文件的作用。因此除非支持系统的限制,其中准许出现任何的字符,并且准许同一相对路径下存在多个同字符名称的目录或文件。 但此字符名称仍然可以准许使用当前Windows系统中通用的后缀名区分文件打开或执行方式的模式,即后缀名可以由支持系统或者客户程序指定。 8、起始扇区编号 记录文件数据的起始扇区,以提供文件存取的磁盘物理位置的入口。[详见数据记录区的说明。] 7、数据记录区详细 1、区域主要功能 记录文件中的数据。 2、区域位置 紧接于分区基础属性区之后,依演示值为0盘面1柱面3扇区起。 3、数据链式存储方式 为了能够完全利用存储空间,FCES沿用通行的链式文件存储方式。但使用自由簇作为逻辑存储的最基本单位。 4、单一自由簇结构 自由簇分为八个部分 功能说明 扇区编号 区内偏移量 区块长度 演示值 检查使用标记 0x0001 0x0000 1 Byte 0xFF 自由簇长度记录 0x0001 0x0001 8 Bytes 略 最后扇区长度记录 0x0001 0x0009 Word 0x001B 文件结尾标记 0x0001 0x000B 1 Byte 0xFF 隶属文件索引编号 0x0001 0x000C 8 Bytes 0x0001000A 随后簇起始扇区编号 0x0001 0x0014 8 Bytes 略 前一簇起始扇区编号 0x0001 0x001C 8 Bytes 略 簇数据 0x0002起 0x0000 [随机] 略 5、单一自由簇结构详细说明 1、检查使用标记 记录此自由簇是否已经被使用,如果未被使用,或隶属文件已经被删除,则标记为0x00,否则标记为0xFF。 2、自由簇长度记录 记录此自由簇占用的扇区数,包括第一扇区的自由簇属性记录。即自由簇数据区扇区数+1。 3、最后扇区长度记录 记录此自由簇占用的最后一个扇区中,文件数据占用的长度。以便于准确获取未完全包含整数个完整扇区的文件的长度。 4、文件结尾标记 标注隶属文件是否在此自由簇中结束。如果结束,则标记为0xFF,且最后扇区长度记录生效,但随后簇起始扇区编号将无效。否则,标记为0x00。 5、隶属文件索引编号 标注此自由簇所隶属的文件索引编号,如果此自由簇是为处理分区物理损坏而生成的,则此记录标记为0x00000000。[详见分区的检查和整理中对分区物理损坏的处理方式。] 6、随后簇起始扇区编号 如果隶属文件未在此自由簇中结束,则此编号记录下一隶属同一文件的自由簇所在位置的编号,以便可以查找到隶属文件的随后数据。否则置空。 7、前一簇起始扇区编号 如果记录隶属文件不由此自由簇开始,则此编号记录上一隶属同一文件的自由簇所在位置的编号,以便可以查找到隶属文件的以前数据。否则记录隶属文件的索引记录所在位置。因为索引记录区的位置固定,所以如果前一簇起始扇区编号属于索引记录区,则说明文件由此自由簇开始。 8、簇数据 记录文件需要被保存的数据的部分或全部。 8、操作系统的索引编号管理和分配 1、概述 索引编号作为文件和目录在文件系统中的唯一标识,对文件和目录的检索、管理等都有很重要的作用。所以作为文件系统的实现和管理,操作系统中的文件系统管理部分的工作之一就是对索引编号进行有效的管理和分配。 为了能够有效的管理和分配已经使用和未使用的索引编号,操作系统必须产生和维护两张数据表,其基本结构一致,分别用于管理文件和目录的索引编号。 此处将此数据表称之为未使用索引编号表[简称UUIT],之所以记录未使用的索引编号,是为了能在建立文件或目录时方便检索到最小的未使用索引编号,并在删除时减少可能产生的工作量。 2、UUIT结构 UUIT可由数组或链表等数据结构构成,主要包含三个域,见下表。 域长度以基础属性表和扩展属性表中的演示值为例。 名称 域长度 功能说明 演示值 Index DWord 作为数组或链表等的标识或索引 0x00000001 Start DWord 未用段的起始索引编号 0x0000001E End DWord 未用段的末尾索引编号 0x0000021D 3、各域功能详细说明 1、Index 作为系统对数据处理等的索引,如在数组中,则为数组第一维的编号。 2、Start和End Start记录未使用索引段的起始编号,End记录未使用索引段的末尾编号。如若0x0000001E至0x0000021D的索引编号都未被使用,则将0x0000001E记入Start,0x0000021D记入End。 如使用数组等定长数据结构,则可能还需要DWord的MaxIndex来记录当前已使用UUIT区域的最大Index。 4、UUIT的管理、保存、维护和初始化 1、目录和文件建立时的处理 总是优先从Index=0的未使用索引段中选取Start位置的编号,如发现此选取的索引编号为0x00000000[对于目录则为0x80000000,本段下同],则选取Index=1的未使用索引段中Start位置的编号,再为0x00000000,则选取Index=2,以此类推。并在选取后,将对应位置的Start改写为Start+1。如果此时Start>End,则将Start改写为0x00000000。 在选取了可使用的索引编号后,检查对应索引编号记录区域的检查使用标记是否为0x00。如果为0xFF,则可能是上一次未能正常保存UUIT,需要检查分区,以重新获取UUIT。[详见检查与逻辑数据损坏处理。] 2、目录和文件删除时的处理 获取被删除目录或文件所占用的索引编号,然后将第一个未被使用的UUIT区域中的Start和End都标记为此索引编号。 3、UUIT的保存和获取 定义索引编号为0x00000000,父目录为0x80000000的文件为未使用索引编号列表保存文件。和其他文件一样,保存在文件系统中。 1、整理与保存 每次结束分区操作时,需要将已有的UUIT进行整理与保存。具体的整理工作是将全数据表依照由小到大的顺序重新排列,并将可以合并的UUIT区域合并,如在由小到大的排序后存在Index=n的UUIT区域中End=m,而Index=n+1的UUIT区域中Start=m+1。将可以遗弃的区域遗弃,如Index=n的UUIT区域中Start=0x00000000。 保存时的工作与保存一般文件相同,将文件和目录的UUIT完全写入索引编号为0x00000000,父目录为0x80000000的文件中,以便下一次启动分区时获取。 2、获取与初始化 每次启动分区时,需要将已存在的UUIT由文件系统读取入内存区域,以方便文件系统的操作。读取时的工作与读取一般文件相同,由索引编号为0x00000000的文件获得。如果0x00000000的索引记录区域的检查使用标记为0x00,则说明UUIT需要被初始化,此时初始化文件UUIT的第一个记录区域的Start=0x00000001,End=0x7FFFFFFF,目录UUIT的第一个记录区样的Start=0x80000001,End=0xFFFFFFFF。此工作也可以由格式化程序进行处理,并保存。 9、文件系统操作 1、目录和文件建立处理 1、获取未使用的索引编号,并检查索引编号区域的使用标记。 2、查找未被使用的自由簇[仅对于文件] 由数据区的起始扇区开始,检查第一扇区的自由簇使用标记,如为0xFF,则读取自由簇长度,并跳转至下一自由簇。如为0x00,则将新建立文件的起始扇区编号标记为此扇区。并将此自由簇的使用标记标记为0xFF,长度标记为1扇区,文件结尾标记标记为0xFF。 2、文件的追加处理 本段包含对文件结尾进行追加的处理方式。 1、获取现有文件的结尾,即包含文件结尾的自由簇。 2、获取可用的下一自由簇 由当前文件结尾自由簇最后一个扇区的后一扇区开始检索,如果自由簇使用标记为0xFF,则读取自由簇长度,并跳转至下一自由簇。直至发现使用标记为0x00的自由簇,将原文件结尾的自由簇的随后簇扇区编号标记为此自由簇的起始扇区编号,并将文件结尾标记标值为0x00。同时将此自由簇的使用标记标记为0xFF。如果需要,比如尚不存在已经建立的自由簇,则同时写入自由簇的长度等其它自由簇信息。 如果选择的自由簇可记录数据长度小于需要追加的数据,则在完成当前自由簇数据区域写入后,再检索下一可用的自由簇。并同样标记当前自由簇的结尾标记和随后簇扇区编号,以及标记下一自由簇的使用标记和写入数据。 如果出现下一可用的自由簇紧接于当前的自由簇的情况,则将两个自由簇合并。需要进行的操作包括,将前一自由簇的长度标记为两个自由簇长度之和,并删除后一自由簇的自由簇信息[即自由簇第一个扇区中的信息]。 如果选择的自由簇可记录数据长度大于需要追加的数据,则修改此自由簇长度记录[包括自由簇长度记录和最后扇区长度记录]至合适于需要追加数据的长度,并在下一扇区建立新的自由簇,将检查使用标记修改为0x00,自由簇长度为原自由簇长度减去之前一个自由簇长度,以便以后用于其它文件的记录。 3、文件的非追加修改处理 本段包含对文件已有数据进行修改的处理方式,要求所修改的数据的位置均在已存在的文件长度内。 1、获取现有文件的起始扇区,并开始记录已被检索文件的长度。 2、通过若干次跳转,将需要修改的数据位置定位于一个自由簇中。 3、准确定位所需修改的数据在自由簇中的位置,并进行修改。 文件的追加和非追加修改处理可能在文件操作中被同时使用。因此可以将追加的功能添加入非追加修改处理中,即在文件达到结尾时,自动追加下一可用自由簇为隶属此文件的自由簇。 4、目录和文件删除处理 1、临时删除[可恢复删除] 此类删除的文件或目录并不被从存储空间中物理擦除,而只是在文件系统中无法被检索到。 具体操作为修改目录或文件的索引记录中的使用标记由0xFF至0x00。如果是目录,还需同时修改隶属于此目录的文件和目录的索引记录中的使用标记。 2、非可恢复删除 此类删除的文件或目录将有可能在一定时间内被恢复,但对分区的重新写入将破坏被删除文件的数据,所以此类删除将被认为是不可安全恢复的。 具体操作包括修改目录或文件的索引记录中的使用标记由0xFF至0x00,和修改UITT中的相应索引记录为未使用。如果是文件,还需修改所有隶属自由簇的使用标记为0x00。如果是目录,还需要同时非可恢复的删除隶属的所有文件和目录。 5、目录和文件恢复处理 1、对临时删除的恢复处理 具体操作包括检索所有索引记录,若满足下列三点要求,则修改使用记录为0xFF。 1、使用标记为0x00 2、索引记录位置与索引编号对应 3、在UITT中未标记此索引编号为可用 同时可以对其父目录或字符名称进行控制,以达到恢复相应目录中被临时删除的文件和目录,或恢复指定文件或目录的功能。 2、对非可恢复删除的试图恢复处理 根据非可恢复删除的处理过程,此类删除的恢复被认为是不一定总能恢复有效的数据。 具体操作包括检索所有索引记录,如果同时满足下列两点要求,则修改使用记录为0xFF。 1、使用标记为0x00 2、索引记录位置与索引编号对应 然后根据起始扇区编号检索所有隶属自由簇[包括可能的自由簇],如果同时满足下列三点要求,则修改使用标记为0xFF。 1、使用标记为0x00 2、对应扇区满足自由簇结构定义,如检查使用标记和文件结尾标记为0x00和0xFF中的一个,随后簇起始扇区编号以后的部分全部为0x00等。如果任何一点不满足,则说明此文件的这个部分及以后内容已被修改,无法继续恢复剩余内容。 3、随后簇起始扇区指向的区域仍然为一个可能的自由簇 虽然可能同时满足以上三点要求的扇区可能并不会很多,但是仍然可能有某个以后写入的文件内容恰好符合以上要求,而被错误修改为自由簇的信息。所以此类恢复将有可能破坏其它的文件,而被认为是不安全的。 6、目录和文件的移动处理 对于FCES分区,移动处理只需要修改父目录的索引编号就可以实现。具体操作为,获取需要移入的目录的索引编号,修改需要移动的目录或文件的父目录索引编号为移入目录的索引编号。 7、目录和文件的复制处理 FCES分区中不允许多个文件指向同一数据区域,所以复制目录或文件需要重新建立新的目录或文件,在新建立的目录或文件的索引记录中复制原目录或文件的索引记录信息,修改父目录索引编号为复制入目录的索引编号。 对于文件,还需要完全写入原文件中的所有数据,并修改起始扇区编号为新写入数据的起始扇区编号。对于目录,还需要同时检索隶属的所有文件或目录并加以复制,同时修改父目录索引编号为新建的目录的索引编号。 10、分区检查和处理 1、分区剩余空间检测 根据以上章节中对FCES分区的定义和实现方式,FCES分区中基本不存在需要预留的区域。可用空间被定义为由数据记录区起,至已经使用的最后一个索引编号所在索引记录区域为止,之间的所有未被使用的自由簇或尚未包含自由簇信息的区域。 检查分区剩余空间时的操作包括, 1、确认已经使用的最后一个索引编号,及其所占用的索引记录区域的物理位置。 2、由数据记录区起始位置起,检查每一个已存在的自由簇,如果使用标记为0x00,则获取此自由簇的长度信息,将其大小累加进寄存器中,并且跳转至下一自由簇。 3、当发现某一位置不再存在自由簇完整信息时,则停止检查,将此位置至最后一个索引记录区域之间的磁盘空间累加进寄存器。 2、检查与逻辑数据损坏处理 因为对于已经加密的文件或目录,在没有密码的情况下无法获取其几乎任何的信息,所以一般要求需要确认密码的前提下进行分区的检查工作。或者当在没有密码的情况下强制检查,则跳过所有已经加密的文件和目录。 检查主要包括三个阶段, 1、索引记录区完整校验 [基础检查] 检查所有索引记录是否有效。 1、检查使用标记是否正确。即是否为0x00和0xFF中的一个。同时检查使用标记是否与未使用索引编号表对应。 2、检查用户编号是否存在。即用户编号记录是否指向一个已经存在的用户。 3、检查索引记录区中各索引编号与其所在位置是否一一对应。 4、检查父目录索引编号是否指向一个有效的目录。即是否文件和目录区分位为1。若为1,则再检查对应的目录是否已经存在。 5、检查类型编号是否标记的为已存在的文件类型。即不存在的类型位是否全部为0。 6、检查创建/修改时间是否有效。即年月日的对应值是否为有效值。 7、检查起始扇区编号是否指向一个有效的自由簇起始位置。包括是否在当前分区内,以及指向扇区是否包含一个有效的自由簇信息。 8、对于加密并且已经提供密码的文件或目录,则首先必须检查密码是否正确。 2、数据区记录检查 [扩展检查] 检查所有的自由簇信息是否有效。 1、检查使用标记是否正确。即是否为0x00和0xFF中的一个。 2、检查自由簇长度记录。即当前自由簇之后是否为一个有效的自由簇,或尚未标注为自由簇的空白区域。 3、检查自由簇隶属文件编号信息是否与之前自由簇及索引记录区的记录是否相符合。 4、检查最后扇区长度记录和随后簇起始扇区编号记录与文件结尾标记是否对应。即当文件结尾标记为0xFF时,最后扇区长度是否大于0x0000。以及当文件结尾标记为0x00时,随后簇起始扇区编号记录是否指向一个有效的自由簇。 3、分区基础属性区检查 [高级检查] 这种检查独立于其它检查,因为分区基础属性区的错误将可能导致分区读取错误,从而无法进行任何读取和检查。 检查分区基础属性区信息是否有效。 1、BPB长度 统计各种属性[基础以及扩展]所占用的总长度与BPB长度记录信息是否一致。 2、检查相关的扩展属性设置是否有效,此功能将依赖于支持的操作系统。 3、分区数据整理和优化 对于FCES分区,分区的数据整理和优化主要是将包含多个自由簇的文件尽量合并到一个自由簇。所以整理和优化数据可能要花费较长的时间。 1、分区整理策略 1、对于FCES分区,最优的状况是每一个文件都只包含一个自由簇,但通常这是不可能,也不算最为合理的优化。特别是对于文件较大,且占用率较高的分区。将所有文件如此优化在某些情况下几乎是不可能的,而且所花费的时间和操作中占用的额外寻址时间相比明显不够划算。 2、介于前一条中的说明,数据整理和优化应该在分析了整个分区自由簇和文件数目的比值,以及自由簇的平均大小的前提下进行合理的整理。 2、分区整理步骤 1、分析整个分区,并统计零碎文件信息。包括文件总数[亦可由UUIT中获取。]、文件的平均大小、自由簇总数、自由簇平均大小等。 2、根据统计结果以及用户问讯选择合适的优化策略,包括允许的最大文件自由簇数目;单文件包含多自由簇情况下,每个自由簇的最小空间等。 3、生成需要进行整理的文件的列表。 4、对于需要进行整理的文件,在有限次的隶属自由簇的移动以后,将文件的某些自由簇进行合并,以满足对自由簇数目和大小的要求。具体合并方法同[9、文件系统操作 -> 2、文件的追加处理 -> 2、获取可用的下一自由簇]中的说明。此过程中,可以利用未被使用的数据记录区域进行文件的移动中介。 4、格式化与物理结构损坏处理 1、格式化处理 1、概述 基础格式化分区操作主要是将索引记录区[IRB]中的检查使用标记和数据记录区[DRB]中自由簇记录信息的检查使用标记清为0x00,同时将未使用索引编号表[UUIT]重置。这样所有的文件信息将全部丢失,同时分区将初始化为空状态,以便于再次写入新信息。与文件不可恢复删除一样,基础格式化分区操作被认为是不可安全恢复的。 扩展格式化分区操作包括索引记录区和数据记录区的清空,同时选择性修改除扩展标识以外的扩展属性表。在清空过程中检查分区的盘面物理错误,同时在相应位置加以标记[详见物理结构损坏处理中的说明]。这样的格式化操作是不可恢复的。 2、格式化处理步骤 1、基础格式化操作 1、清除索引记录区[IRB]中的检查使用标记 由索引记录区起始位置起,依单一索引记录长度[由基础属性表中的索引长度获得]跳转,同时修改第一位置的检查使用标记为0x00。 2、清除数据记录区[DRB]中自由簇记录信息的检查使用标记 由数据记录区起始位置起,依单一自由簇长度[由自由簇记录信息中的自由簇长度获得]跳转,同时修改第一位置的检查使用标记为0x00。 3、重置未使用索引编号表[UUIT] 见未使用索引编号标的获取与初始化部分。 2、扩展格式化操作 在基础格式化操作的基础上,附加清空索引记录区和数据记录区及分区物理检查。 2、分区物理检查 1、概述 分区物理检查是检查分区所在的硬盘区域的物理错误。此操作可以独立于扩展格式化之外进行。 2、检查方式 对分区包含的所有扇区进行写操作,包括全[0]写入和全[1]写入,再读取判断正误。如果不是在扩展格式化后进行检查,则还需要记录原扇区内容,并在检查后重新写入。 3、错误处理方式 1、索引记录区物理错误 将所在位置的索引编号使用记录标记为已使用,同时将此索引记录的使用标记标为0xFF。如果不是在扩展格式化后进行检查,则还需要将原有的索引信息[依照发现损坏前数据]重新存入另一空索引记录区,修改其索引记录编号,并将其在未使用索引编号表中标记为使用。如果发现数据存在严重损害,如起始扇区编号的信息存在错误[包括超界及与自由簇隶属文件信息不符。],则可能需要搜索整个数据记录区以查找到隶属的自由簇并修改对应的起始扇区编号。 一般认为文件的隶属自由簇在分区中的排列是顺序的,除非此某些自由簇中存在物理错误而被修复过。在此类修复时,同时检查所有的隶属自由簇的之前自由簇和随后自由簇的起始扇区编号,以查找到起始扇区。 2、数据记录区物理错误 在所在位置建立一个自由簇,长度视连续的物理错误扇区而定。将存在物理错误的扇区包括在此自由簇中。如果不是在扩展格式化后进行检查,则还需要将所属扇区[依照发现损坏前数据]及之前和之后各一个扇区的信息重新组成自由簇,寻找未被使用的数据记录区保存,再在前后位置重新组成自由簇,并与新的自由簇链接。 11、可被附加的功能 由于FCES分区未破坏或改变文件的块存储方式,所以如数据的压缩和加密功能仍然可以在文件系统上被附加。具体视支持的文件系统控制软件。 加密功能应以流加密方式为基础,即要求任何一位的处理均与之前或之后位的信息无关,而只与其在文件中的位置相关。以下提供加密的一种解决方案,即流插入检查加密方式[FIC]的说明。 Flow Insert & Check(流插入检查) 特点概述 将传统的单纯计算机程序检查数据流准确性的方式改为了计算机和用户同时检查。在保证程序能较高比率的检查出密码错误造成的数据流错误的前提下,通过单纯程序检查结果的不唯一性提高安全性能。 实现方法 流插入检查(FIC)是通过在数据流中插入固定位置的检查码并将密码嵌入实现的。整个加密处理过程将分为插入校验码(Flow Insert Part)和密码嵌入(Code Inset Part)两个部分。解密处理过程将包括同时处理的密码提取(Code Extract Part)和校验码检验及去除(Flow Check Part)两个部分。 加密处理过程 加密处理过程需要4个参数: Flow 字符串,表示需加密的数据流 Code 字符串,表示加密时使用的密码 Bits 整型,用于确定插入校验码的间隔 Mode 整型,用于确定校验码ASCII码二进制数位的来源 1.插入校验码(Flow Insert Part) 每8*Bits位插入一个校验码,校验码将依靠前8*Bits位的数据产生。其ASCII码的二进制数为其中的固定8位的ASCII码二进制数的Mode位的顺序排列,固定位的选取由Bits的设定控制。选取方式为第1位,第Bits+1位,第2*Bits+1位,直至第7*Bits+1位。 2.密码嵌入(Code Inset Part) 在生成新的数据流之后,依次把密码的各个位加入流中,方法是进行位异或运算。 设数据流为a0,a1,a2,a3,a4,a5,a6,a7,a8 密码为b0,b1,b2 则经过密码嵌入处理的新的流为 a0 xor b0,a1 xor b1,a2 xor b2,a3 xor b0,a4 xor b1,a5 xor b2,a6 xor b0,a7 xor b1,a8 xor b2 解密处理过程 解密处理过程需要4个参数: Flow 字符串,表示需解密的数据流 Code 字符串,表示解密时使用的密码 Bits 整型,用于确定提取校验码检验的间隔 Mode 整型,用于确定校验码ASCII码二进制数位的来源 3.密码提取(Code Extract Part) 在数据流中为每一位数据与所获得密码对应位再进行一次位异或运算。如果密码正确即得到了未加密时的数据流。 4.校验码检验及去除(Flow Check Part) 在提取密码的同时,将进行校验码检验及去除的工作。每当提取了8*Bits+1位的密码之后就自动进行。方法是检验第8*Bits+1位数据的ASCII码的二进制数是否是前8*Bits位中固定8位的ASCII码二进制数的Mode位的顺序排列。 加密的可行性 对于一个给定的数据流和密码,当使用了上述的加密方法,流的数据不再保持原有的状态,无法直接读取。并且因为是流和密码混合的运算,在不知道其中任何一个的情况下,都无法通过数学方法得到另一个。此运算对于任意一位,都可表示为函数z=f(x,y),x为明文,y为密码,z为暗文。由函数性质可知,在x、y、z中任意两个未知的情况下,无法用数学方法同时求得。因此如果被得知某一组明文、暗文和密码,甚至在知道了整个加密方法(包括可以调节的两个参数Mode和Bits)的情况下,要想通过暗文在没有密码的情况下得到明文都是很困难的。在下文的优越性讨论中有关于提高的安全性能及防止相关的传统破解方式的介绍。 解密的可行性 如果需要解密后的数据保持原状,则需要两点条件: 1、 对数据流中一位与同一个数进行两次异或运算,所得结果与原数相同。 2、 在加密过程中插入的校验码能够在解密过程中被正确识别。 先证明第一点 因为在加密和解密过程中使用的是数据流对应的Ascii码,所以不妨设数据流中某一位的Ascii码值为X(1<=X<=255)。 由于加密和解密中只有插入的校验码与数据流的排列有关,而在此的第一点中不讨论校验码的问题,所以对于任意位,可以认为其实独立的。上面的假设不失一般性。 又对于一位二进制数的异或运算,其结果只与本位相关,不存在进位和退位的情况。所以对于固定二进制数的X,只要对应的每位二进制数在与另一个二进制数K对应位进行两次异或运算后,结果与原数X一致,就可以认为第一点条件满足。 问题归结为某个二进制数A与另一个二进制数B(A、B取值无必然联系)进行两次异或运算后,仍然为A。 因为A、B的取值无必然联系,所以存在A=B和A<>B两种情况。根据异或运算的定义 当A=B时,A xor B=0。而0 xor B,当B=1时,其值等于1,由A=B得,A=1=0 xor B。同理,当B=0时,0 xor B=0=A。 当A<>B时,A xor B=1。当B=1时,1 xor B=0,又A<>B,所以A=0=1 xor B。同理,当B=0时,0 xor B=1=A。 再证明第二点 由加密时插入校验码和嵌入密码的顺序可知,校验码是由原数据流产生。而解密是正好相反,先进行密码提取,再检查校验码。所以当密码正确时,校验码也同样保持在嵌入密码前的状态。所以利用同样的方法生成的对比码和校验码应该是相同的。 3、开发组成员资料集 资料集填写要求: 1、资料集中每人只允许填写和修改一组信息,如果发现存在重复的信息[特指可以识别身份的项目,包括联系方式、证件号码、修改内容等的信息。],则只有第一条有效。填写时请在之后添加一张表格。 2、需填写信息中加入*的为必添内容,如果存在遗漏,则对应的一组信息视为无效。 3、请真实填写联系方式,并及时关注联系方式是否畅通,以便在将来能维护您作为开发组成员的权利。 1、核心开发组成员资料集 称谓* Hzj_jie 年龄 性别 联系方式* Hzj_jie@hotmail.com 证件类型 证件号码 开发内容* FCES最初版本的所有内容,包括自由簇思想、分区基础属性区、自由簇管理方式、文件索引记录管理方式、简单的文件系统实现。以及流插入检查加密方式的加密解决方案。 添加日期* 2、修改组成员资料集 称谓* 年龄 性别 联系方式* 证件类型 证件号码 修改内容* 添加日期*

[转帖]FCES - 一种全新的分区文件系统结构

    win98认识它吗?

TOP

返回列表 回复 发帖