收藏 分销(赏)

Yaffs功能说明.docx

上传人:仙人****88 文档编号:12072619 上传时间:2025-09-06 格式:DOCX 页数:23 大小:66.22KB 下载积分:10 金币
下载 相关 举报
Yaffs功能说明.docx_第1页
第1页 / 共23页
Yaffs功能说明.docx_第2页
第2页 / 共23页


点击查看更多>>
资源描述
§ 1 背景 § 2 发牌 § 3 Yaffs 和 Yaffs 直接接口有哪些? § 4 为什么使用 Yaffs 吗? § 5 源代码和 Yaffs 资源 § 6 系统要求 § 7 如何与实时操作系统/Embedded 系统集成 Yaffs § 7.1 源文件 § 7.2 整合POSIX应用程序接口 § 7.3 RTO集成接口 § 8 Yaffs NAND模型 § Yaffs1 8.1 NAND模型注意事项 § Yaffs2 8.2 NAND模型 § 9 NAND配置和访问接口 § 9.1 常见配置项 (Yaffs1 和 Yaffs2) § 9.2 共同访问函数 (Yaffs1 和 Yaffs2) § 9.3 Yaffs1 访问函数 § 9.4 Yaffs2 访问函数 § 10 使用POSIX文件系统接口 § 10.1 向 Windows POSIX差异-喜欢接口 § 10.2 基本概念 § 10.3 错误代码 § 10.4 链接 — — 硬种 (不是符号链接) § 10.5 符号链接 § 10.6 基于句柄的文件处理 § 10.7 更改文件大小 § 10.8 获取/设置有关文件的信息 § 10.9 更改目录结构和名称 § 10.10 搜索目录 § 10.11 装载控制 § 10.12 其他 § 11 示例: yaffs_readdir() 和 yaffs_stat() 1 背景 本文档的目的是描述接口的 Yaffs 直接接口 (YDI) 以及提供足够的信息,以允许 Yaffs 初步评价。这份文件试图把重点放在重要的系统集成商的问题没有得到 Yaffs 是如何工作的太详细。其他文件提供 Yaffs 的工作原理进行深入的讨论。 2 发牌 Yaffs 最初被用于 Linux 下GNU公共许可证 (GPL) 发布。很快就查明,Yaffs 将他们应用的理想选择,但是却不能使用GPL的各种嵌入式开发人员在其系统中基于代码的。Aleph 一有替代的发牌安排,以支持此类应用程序。 3 Yaffs 和 Yaffs 直接接口有哪些? Yaffs 代表尚未另一个 Flash 文件系统。Yaffs 是第一个文件为设计的系统,从地上起来, nand 闪存存储。 2002 年 Aleph 一着手查明使用NAND闪存作为文件系统的文件系统选项。当时可用的各种文件系统进行评价和所有被发现缺乏一种方式或另一种。确定合适的nand 闪存存储文件系统需要和 Yaffs 为了满足这一需要。 虽然 Yaffs 最初设计用于NAND闪存,它已经被成功地用NOR闪存系统,甚至作为RAM文件系统。这允许高可靠性文件系统构造也不闪光,用为更高的密度和性能的NAND闪存未来的迁移路径。 Yaffs 最初被设计用于 Linux 的操作系统,但非常模块化的方式设计了。经营系统特定代码是主要的 Yaffs 文件系统代码分开。这允许 Yaffs 相当干净地移植到其他操作系统通过操作系统个性模块。这样一个个性模块是允许 Yaffs 将简单地集成与嵌入式系统,有或无的RTOS的 Yaffs 直接接口 (YDI). Yaffs 被用于许多产品使用各种操作系统,包括 Windows CE和各种高昂,包括 ThreadX、 vXworks、 pSOS 举几个。 请注意,对不使用YDI的 eCOS 的本机端口。这是支持并由 eCocCentric 分发。( Yaffs2,Yaffs,较新版本支持更广泛的NAND闪存组件包括 2 k 页设备,并产生相等或更好的性能。它包括 Yaffs1 兼容性代码,所以 Yaffs1 图像仍然工作,迁移是相当简单。 Nand 闪存文件系统, YDI也提供提供给RAM仿真层,以允许 Yaffs 太作为RAM文件系统操作。虽然RAM仿真也许不是一个专用的RAM文件系统尽可能高效的这允许一个行之有效的文件系统,使用两个RAM和 flash。 4 为什么使用 Yaffs 吗? Yaffs 是专门针对NAND闪存的第一次,和也许是唯一的文件系统。这意味着设计了 Yaffs 变通的各种限制和怪癖的NAND闪存,以及利用与非门实现一个有效的文件系统的各种功能。 考虑一些特点: § Yaffs 已被很好的证明,并已被用于大量使用许多不同的操作系统、 编译器和处理器的几种产品在出货。 § Yaffs 是便携式用 C 编写的是中性的字节序。 § Yaffs 提供坏块处理和ECC算法来处理在NAND闪存中的不足之处。 § Yaffs 是日志结构文件系统,使电力故障等导致了腐败非常稳健。 § Yaffs 具有高度优化和可预测的垃圾收集策略。这使得高性能和非常确定性时相比相似的文件系统。 § Yaffs 具有较低的内存占用比大多数其他日志结构的闪存文件系统。 § Yaffs 提供了种类繁多的POSIX-样式文件系统支持,包括目录,符号和硬链接等通过标准文件系统接口调用。 § Yaffs 是高度可配置工作与各种闪光的几何形状,不同的ECC选项、 缓存选项等。 § Yaffs 直接接口是简单整合在一个系统 — — 只有几个接口功能的需要。 § Yaffs 可以用广泛的内存技术。 5 源代码和 Yaffs 资源 请注意适用于使用 Yaffs 代码的许可条款。 作为 Yaffs 的所有信息的枢纽。 本文档是广泛指 Yaffs 源代码。并且可以通过此站点上的下载链接。 有其他各种文件和 Yaffs 讨论 Yaffs 邮件列表。 咨询服务也是可用的。 6 系统要求 确定最低系统要求往往是相当困难的。以下介绍只是指引了。如果与联系 Aleph 一进行更详细的分析要求。 § Yaffs 是中性的字节序和小端字节序和大端字节序处理器工作正常。 § Yaffs 代码已经被成功地与许多不同的 32 位和 64 位 Cpu 包括MIPS,68000, ARM、 PowerPC、 ColdFire x 86 变种。Yaffs 应使用 16 位 Cpu 太,但这是一般未经测试,可能需要一些调整,具体取决于编译器选项。 § 由于 Yaffs 是日志结构的RAM被需要建立可接受的性能的运行时数据结构。作为一个经验法则,预算大约每 2 个字节块的NAND闪存,在一大块通常是NAND的一页。NAND与 512 字节的页,预算大约 4kbytes 的RAM每 1Mbyte 的nand 闪存。2kbyte 页设备预算大约每 1Mbyte NAND 1 kb. 7 如何与实时操作系统/Embedded 系统集成 Yaffs Yaffs 直接接口 (YDI) 包装 Yaffs 是简单整合的方式。您需要提供几个函数 Yaffs 使用谈谈您的硬件和操作系统。Yaffs 提供了一整套的POSIX-兼容功能应用程序可以使用跟它说话。 除了 Yaffs 核心文件系统, YDI有三个部分,每个所述在进一步章节中详细: § POSIX应用程序界面: 这是应用程序代码使用访问 Yaffs 文件系统的接口。(打开、 关闭、 读取、 写入、 等) § 实时操作系统集成接口: 这些都是必须为 Yaffs 访问实时操作系统系统资源提供的功能。(初始化、 锁定、 解锁、 时间、 设置错误) § 闪存配置和访问接口: 这些都是必须为 Yaffs 访问NAND闪存提供的功能。(初始化,读取数据块,写块,擦除块,等等)。这些函数可能由芯片组供应商提供,或者可能需要写的系统集成商。 7.1 源文件 下面的源代码文件包含核心文件系统: yaffs_allocator.c 分配 Yaffs 对象和 tnode 结构。 yaffs_checkpointrw.c 检查点数据写入流光 yaffs_ecc.c ECC代码 yaffs_guts.c 主要的 Yaffs 算法。 yaffs_nand.c Flash 接口抽象。 yaffs_packedtags1.c yaffs_packedtags2.c 标记包装代码 yaffs_qsort.c 在 Yaffs2 扫描期间使用 Qsort yaffs_tagscompat.c 要支持 Yaffs1 模式的标记兼容性代码。 yaffs_tagsvalidity.c 标签有效性检查。 Yaffs 直接接口是在 yaffsfs.c 的接口函数与在 yaffsfd.h 中定义的结构。 示例和测试生成文件: dtest.c 测试工具。也可以用于更好地理解某些函数如何调用工作的示例代码。 yaffscfg2k.c 测试配置。 yaffs_fileem.c yaffs_fileem2k.c Nand 闪存仿真使用一个文件作为后备存储。 yaffs_norif1.c 亦不闪光模拟和接口的示例。这被配置为 M18 闪光。 yaffs_ramdisk.c yaffs_ramem2k.c 使用RAM模拟. ynorsim.c 另一个也不模拟。 进一步测试文件是直接测试和直接/python。 7.2 整合POSIX应用程序接口 在 yaffsfs.h 中定义的应用程序接口。这些提供了POSIX文件系统接口。大多数情况下,该接口由前缀为yaffs_的标准俱乐部函数名称。例如, yaffs_open(), yaffs_close()等。   还有很大的灵活性,在如何使用这些函数和系统集成商需要确定系统的最佳策略。 这些函数可以直接使用,与编写使用这些名称的代码。举个例子 int main(...) { // initialisation f = yaffs_open(...); yaffs_read(f,...); yaffs_close(f); } Yaffs 功能的包装也可以以某种方式允许使用 yaffs 而无需修改现有代码。例如: #define open(path, oflag, mode) yaffs_open(path, oflag, mode) .. int main(...) { // initialisation f = open(...); read(f,...); close(f); }   如果使用多个文件系统可以使用更复杂的方法是提供重定向功能。例如: int open(const char *path,...) { // Determine which file system is being used if(it_is_a_yaffs_path(path)) return yaffs_open(...); else { // Do something else } } 一些实时操作系统提供一种灵活方式集成的案例YDI可以通常使用这些接口来访问 yaffs 文件系统的文件系统。 7.3 RTO集成接口 可以使用 Yaffs 之前,它需要与系统集成和配置,以便执行正确的操作。 为此,您需要修改配置文件。在 yaffscfg.c 和 yaffscfg2k.c 提出了一个示例配置文件。 这是一个比较简单的过程,并定义RTO访问函数。 实时操作系统访问函数包括: § void yaffsfs_SetError(int err): 由 Yaffs 设置的系统误差。 § void yaffsfs_Lock(void): 由 Yaffs 锁定 Yaffs 从多线程访问调用。 § void yaffsfs_Unlock(void): 由 Yaffs 解锁 Yaffs 调用。 § __u32 yaffsfs_CurrentTime(void): 从 RTO 获取当前时间。 § void yaffsfs_LocalInitialisation(void): 调用以初始化 RTO 上下文。 如果在多线程环境中使用 Yaffs,然后通常yaffs_LocalInitialisation()将初始化一个合适的 RTOS 信号量和yaffs_Lock()和yaffs_Unlock()将调用适当的函数来锁定和释放信号量。 yaffs_CurrentTime()可以对系统的使用任何时间增量。如果这不是必需的它是很好,只是使用一个函数,可以直接返回零。 虽然这里没有显示,Yaffs 也需要内存分配/释放功能的malloc()和free()的默认。这些,以及其他一些功能可以调整在文件 ydirectenv.h 应用程序代码使用 Yaffs 之前,必须调用yaffs_StartUp()函数,必须安装适当的分区。这通常是在系统启动代码: ... /* System boot code: Start up Yaffs. */ yaffs_StartUp(); yaffs_mount("/boot"); ... 8 Yaffs NAND模型 在定义之前闪存集成接口,它是重要的是理解的模型和相应的命名整个 Yaffs 和它的文档中使用。 Yaffs 采用较高的抽象模型对NAND闪存。这样很大的灵活性,它可以利用的方式。 Yaffs 为NAND flash 设计,使下面的假设和定义: § Flash 被安排在块中。每个块的大小相同,包括块一个整数。每个数据块被视为一个单一的可擦写项目。一个块包含块的数目。 § 一大块,就相当于闪存的分配单元。为 Yaffs1,每个块等于 512 字节或更大的NAND页 (即 512 字节或更大的数据部分和一个 16 字节的备用区域)。对于 Yaffs2,一大块通常是较大 (如。 2 k 页在设备上,一大块通常会单 2 k 的网页: 2kbytes 数据和 64 字节的备用)。Yaffs2 是能够通过使用带内标记和较小的块大小工作。 § (读取和写入) 的所有访问都是块页面对齐。一些读取可能只读标签存放备用区。 § 当编程的NAND flash 时,只有零中的位被编程的模式是相关的,一位是"不在乎"。例如,如果一个字节已经包含二进制模式 1010年,然后编程 1001年将导致的模式,即是逻辑和这两种模式。1000.这是不同的NOR闪存,通常会中止尝试转换成 1 的 0。 Yaffs 标识按块编号块和块大块的 id。一大块 Id 计算如下: chunkId = block_id * chunks_per_block + chunk_offset_in_block Yaffs 将视为被免费或擦除一块空白 (0xFF 填充)。因此,相当于一个 Yaffs 分区的格式是抹去并不是坏的所有块。 Yaffs2 具有广义的标记接口以提供更好的灵活性,以满足广泛的具有较大的页面和更严格的编程限制的设备。Yaffs2 因此处理比 Yaffs1 更抽象的构造而更多的努力所需的nand 闪存接口. Yaffs1 8.1 NAND模型注意事项 历史的 Yaffs1 标签结构是符合 SmartMedia 规范使用 512 字节的页。还有现在可以配置更多的灵活性,在事情。 Yaffs1 是能用作各种内存布局,所以只要 flash 支持能力覆盖标签区域,将删除标记设置为零。 如果未设置 yaffs_Device useNANDECC 提起,然后 yaffs 将执行ECC计算。如果这个学会然后 yaffs 会期望NAND驱动程序 todo 任何所需的ECC检查。在不使用ECC的设备,例如NOR,设置 useNANDECC = 1,然后不做任何的ECC 。 Yaffs1 闪蒸模型预计面积 16 备用字节,其中一些用于标记。在 yaffs_packedtags1.c 中指定的空闲字节数和字节的使用之间的映射 曾经在许多NORYaffs1 模型 — — 基于系统。一个特别是 flash 的很好的例子是 flash 的在 yaffs_norif1.c 上英特尔 M18 闪光使用 1 k 数据页和模拟备用区可重写领域实现 Yaffs1 模式。这不使用ECC ,但相反使用校验和。 Yaffs2 8.2 NAND模型 Yaffs2 使用一个不同的标签布局比 Yaffs1。Yaffs2 使用 yaffs_ExtendedTags structure.which 是按照 yaffs_packedtags2.c 中的代码包装。 与非门处理程序层必须使用或填充的字段。字段具有以下含义: § validMarker0设置为 0xAAAAAAAA § chunkUsed如果为 0 然后这一块是不会使用 § objectId这块属于该对象。如果为 0 然后这不是对象的一部分 (即.未使用)。 § chunkId如果 0,那么这个是标题,其他文件中的指定位置的数据块 § byteCount文本块中的数据字节数。只有有效的数据块 以下字段才有意义,当我们读到 § eccResultECC 检查阅读时的结果 § blockBad如果为 0 然后块不是坏的。 对 Yaffs1 有意义和应为零的 Yaffs 以下字段: § chunkDeleted如果非零,块标记为已删除。 § serialNumber2 位的序列号。 以下字段 Yaffs1 的涵义,并应该是零为 Yaffs2: § sequenceNumber此块的序列号 可选的额外信息,如果这是对象头 (只有 Yaffs2)。使 Yaffs1 为零。 如果设置了extraHeaderInfoAvailable , extraXXX的所有字段都必须有效。 § extraHeaderInfoAvailable有可用的额外信息如果这不是零。 § extraParentObjectId父对象 id。 § extraIsShrinkHeader它是一个缩头吗? § extraShadows这造成暗影另一个对象? § extraObjectType哪种对象类型? § extraFileLength如果它是一个文件的长度。 § extraEquivalentObjectId等效对象 Id,如果它是一个硬链接。 最后: § validMarker1必须是 0x55555555。 有相当多的字段,其中有些是可选的。extraXXXX的所有字段都都塞入方式可加快扫描对象标头标记更多的数据的一种方式。这些都是可选的都应为零如果不支持。 最简单的方法来处理yaffs_ExtendedTags是使用函数给出了在 yaffs_packedtags2.h 做包装和拆包。这些都是: yaffs_PackTags2()和yaffs_UnpackTags2(). 这些函数创建或使用包装的标签结构可以被存放在NAND备用区。在 yaffs_fileem2.c 中给出实例,如何做到这一点 9 NAND配置和访问接口 有关如何配置示例,请参阅 yaffs_cfg.c 和 yaffs_cfg2k.c。 配置的这一部分涉及到配置芯片和合适的接入功能。 这是在yaffs_StartUp(). 在启动之前到该设备的配置,这是操作的重要的是操作的理解 Yaffs 支持两种不同模式: § Yaffs1: 这是原来的运作模式,只是供每页 512 字节设备。 § Yaffs2: 这种运作模式支持较大的页面大小。 大多数配置选项都是相同的两个,但他们有不同的NAND访问功能。 你可能有一个系统,使用 Yaffs1 和 Yaffs2 分区的组合。 9.1 常见配置项 (Yaffs1 和 Yaffs2) 配置包括两个部分: § 设置装载点表。 § 设置设备。 Yaffsfs_DeviceConfiguration 是一个条目,有两个部分: 装入点名称和指向 yaffs_Device 结构的指针。装入点名称用于确定特定的 yaffs_Device 将可能被找到,将会在目录结构中。可以有任意数量的挂载点,它们可以嵌套。例如: static yaffsfs_DeviceConfiguration yaffsfs_config[] = { { "/", &ramDev}, { "/flash/boot", &bootDev}, { "/flash/flash", &flashDev}, { "/ram2k", &ram2kDev}, {(void *)0,(void *)0} /* Terminate list */ }; 每个逻辑存储实体被称为 yaffs_Device,虽然是最好的作为分区描述符。每个 yaffs_Device 可以对应: § 整个闪存设备。 § 闪存设备的一部分。 § 闪存设备以外 (例如也许RAM仿真)。在测试期间,常用这种仿真功能使用主机系统硬磁盘文件或 nfs 挂载的文件作为一种替代存储机制。 两个或多个 yaffs_Devices 可以驻留在单个物理闪存设备通过指定不同的开始和结束块。例如这里有一个例子,单个设备分为两个分区: // /boot ...... bootDev.param.startBlock = 0; // First block. bootDev.param.endBlock = 55; // Last block in 2MB. // /disk ... diskDev.param.startBlock = 56; // First block after 2MB diskDev.param.endBlock = 1023; // Last block in 16MB 必须根据 Yaffs 优化文档配置所有的 yaffs_Device 结构。 9.2 共同访问函数 (Yaffs1 和 Yaffs2) Yaffs1 和 Yaffs2 配置必须提供指向以下函数: int (*eraseBlockInNAND)(struct yaffs_DeviceStruct *dev,int blockInNAND) Yaffs 调用这个函数来擦除闪存块。 int (*initialiseNAND)(struct yaffs_DeviceStruct *dev) Yaffs 调用此函数在开始之前得到调用其他函数来访问 yaffs_Device。这允许系统集成商控制点来执行任何所需的初始化 (eg。 设置芯片选择等.)。 9.3 Yaffs1 访问函数 对于 Yaffs1 分区 yaffs_Device 配置还指定指向两个 Yaffs 调用来访问NAND的这个 yaffs_Device 的进一步函数的指针。为更好地了解这些功能,请参阅 Yaffs NAND模型。这些函数是: int (*writeChunkToNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, yaffs_Spare *spare) Yaffs 调用这个函数,将数据写入nand 闪存。数据指针可能为 NULL ,如果只正在写入备用区,发生在大块正在删除或退休。如果数据指针是空然后就不要写数据。业余的指针将不能为空. int (*readChunkFromNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, __u8 *data, yaffs_Spare *spare) 当从 flash 中读取一大块,Yaffs 调用这个函数。参数的含义从以上所述,是显而易见的但请注意数据和备用字段可能为 NULL,在这种情况下不应引用这些指针。 9.4 Yaffs2 访问函数 操作的 Yaffs2 模式是操作的灵活得多的 Yaffs1 模式。这允许更多不同类型的闪光,但略有增加用于NAND访问函数的复杂性。 与操作的 Yaffs1 模式,Yaffs 执行坏块检测和标记,可以选择执行ECC。它可以这样做,是因为它假定NAND备用区以某种方式结构。操作的 Yaffs2 模式不再可以使这些假设这意味着系统集成商必须提供稍微复杂的函数。然而,接口是还比较简单,特别是如果现有代码作为基础的。 int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev, int chunkInNAND, const __u8 * data, const yaffs_ExtendedTags * tags) int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev, int chunkInNAND, __u8 * data, yaffs_ExtendedTags * tags) int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo); int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo, yaffs_BlockState * state, int *sequenceNumber) writeChunkWithTagsToNAND()和readChunkWithTagsFromNAND()函数必须保存或检索的数据和扩展的标记。请参阅 Yaffs2 NAND 模型更好地了解如何处理标记的解释。请注意,在某些情况下,数据和标记指针可能为 NULL,驱动程序代码应该忽略转让从或都为 NULL 的指针。 Nand 闪存访问函数还必须提供一种机制用于标记和跟踪坏块。如果检测到坏块,Yaffs 决定将那块标记坏,则调用markNANDBlockBad()函数。 queryNANDBlock()函数做两件事: § 它确定的块状态 § 如果块是在使用它也检索块的序列号。 到目前为止最简单的方法来理解这一切是指提供的示例代码。 10 使用POSIX文件系统接口 本节的目标可能不是很熟悉访问文件系统通过POSIX和POSIX的读者-界面等。 10.1 向 Windows POSIX差异-喜欢接口 MSDOS和 Windows 提供POSIX-艾克接口。如果您熟悉这然后这会帮助你。有的不过一些略有差异,最重要的是: § Windows 有没有链接的概念,并有文件名称和文件之间的 1:1 映射。POSIX支持文件与零,一个或很多名称。请参阅链接和取消链接文件部分。例如POSIX允许您取消链接的文件 (即删除的文件的名称) 时仍在使用。你可以继续读/写文件但尽快关闭该文件最后一个文件句柄,它将被删除。另一方面,Windows,不允许你要取消链接的文件,在使用时。 § Windows 命名驱动器的一封信。POSIX已没有驱动器盘符。整个的POSIX文件系统是在单个目录树。 § 同一件事的目录和"文件夹"。 10.2 基本概念 文件 文件是存储在文件系统中的对象。yaffs 支持以下文件类型: 一个正常的文件是存储在文件系统中的字节序列。 目录保存到其他文件的链接。 符号链接保存到另一个文件的名称。 一个特殊的文件保存设备 id 或类似的信息。 目录 这是一种结构,包含链接,允许按名称找到的文件。请注意,单个文件可能有很多联系 (即名称) 很多人会发现在很多地方的目录结构中。 链接 这是一个允许要找到的文件的名称。有两种类型的链接: (有时称为硬链接) 的真正链接和符号 (或软) 链接。 句柄 文件句柄提供上下文,从中可以访问和操纵文件。一个句柄具有当前的文件位置指针,它指向该文件在哪里被读取或写入。多个句柄可以同时访问单个文件。 文件模式 模式是一组定义的文件,以及与该文件关联的当前权限类型的标志。 路径 这是一个定义的目录和文件名称的字符串。例如: "/ 数据/直接-1/file1" 文件元数据 这是有关文件,不包括该文件的内容的信息。元数据包括名称、 模式、 大小和其他详细信息。 山, 分区, 文件系统 所有这些术语都是指单一的安装 flash 区域。每个安装挂接到一个共同的目录结构。 使用既为一个单一的安装分区的文件系统有时会令人困惑,因为它是一词,以及文件系统的代码。换句话说,我们可以说,两个"/ 引导"是一个文件系统,也可以说,yaffs 是一个文件系统。 inode 号 Inode 号是标识内装载的对象的唯一编号。请注意,inode 之间不是唯一两个或更多的坐骑。有是没有办法达成一个文件的 inode,只能通过它的联系。 10.3 错误代码 大多数功能导致错误代码如果函数执行不成功。在这些情况下 yaffs 调用一个函数,称为yaffs_SetError()的错误值。此函数可以将配置为错误交付系统的错误机制。 对于返回整数的函数,返回的值小于 0 指示错误发生。如果出现错误,返回指针的函数将返回NULL 。 10.4 链接 — — 硬种 (不是符号链接) 起初我们只在考虑实际链接和不符号链接。有时真正的链接也称为硬链接来区分它们的符号链接 (这有时被称为软链接)。 链接和文件之间的区别是微妙的可能会造成混淆。简要: § 文件是文件系统中存储的对象 § 链接是如何连接到的目录结构。 第一个链接到一个文件使用创建的文件创建电话: yaffs_open()、 yaffs_mknod()、 yaffs_symlink() 、 yaffs_mkdir(). 使用yaffs_unlink()函数,可以破坏的链接。目录摧毁使用yaffs_rmdir()函数 (哦,和目录必须为空)。 一旦文件既未使用 (有没有句柄打开它) 并没有指向它然后删除。 链接可以使用yaffs_rename()函数重命名。 文件可能有很多联系。可以使用yaffs_link()函数创建这些。所有的链接访问同一个文件,还有没有人链接被认为是"真正联系"和其他人被"重复链接"。所有链接到的文件都具有相同的优先级。如果你看看 inode 号,"a"和"b",然后他们会是一样的因为它们是完全相同的文件参考。 因此: 1. 如果我们开始与一个文件称为"a",然后我们现在有两个链接指向同一个文件的调用yaffs_link(“a”, “b”) 。我们无法分辨它们。 2. 如果我们现在取消链接"a",文件仍然存在下"b"的链接。 3. 如果我们现在取消链接"b"将不再链接文件。如果有一个句柄打开到文件,然后我们还可以通过句柄访问该文件并继续读取或修改的文件。如果没有链接到它删除该文件。 4. 如果未链接的文件保持活着,因为被打开的句柄,文件不会显示在目录结构中 (因为它已没有联系) 和尽快关闭句柄 (或如果是卸载的文件系统) 将被删除。 有一些限制,在如何使用链接: § 您要链接到的现有文件必须存在。 § 你的链接到的文件必须在同一山 (分区) 作为您正在创建的链接。 § 你无法创建链接到目录,因为这将允许创建递归循环。 § 新的链接名称必须不存在。 10.5 符号链接 现在,您了解链接的努力,我们将介绍符号 (或软) 的链接。 符号链接保存为一个不同的对象的别名。在路径中使用的符号链接时使用别名。到那程度上硬链接和符号链接是相同的。 您可以删除yaffs_unlink()函数,就像硬链接和符号链接。 然而,有一些重要的差异。符号链接只是其链接的功能,当评估路径,从而: § 你正在创建一个别名来不必存在的文件。 § 您正在创建一个别名文件必须不在同一座山。 § 您可以创建指向目录的符号链接。 § 符号链接将不保持文件本身。只有一个硬链接可以这样做。 因此: 1. 如果我们开始与一个文件称为"a",然后调用yaffs_symlink(“a”, “b”)我们现在有一个链接到的文件称为"a"和符号链接 aliasising 从"b"为"a"。 2. 如果我们使用yaffs_open(“a”)或yaffs_open(“b”)他们将打开同一个文件。路径的决议机制替代品的别名,所以会抬头"a"。这同样适用于几乎所有需要的路径,如yaffs_truncate(), yaffs_stat()等的功能。唯一的例外是yaffs_lstat()和yaffs_readlink()将视为指向符号链接而不是文件路径。 3. 你可以告诉"a"和"b"分开使用yaffs_lstat()。yaffs_lstat(“a”)将显示文件的信息"a"。yaffs_lstat(“b”)将显示为符号链接本身的信息。注意与硬链接的区别。硬链接与yaffs_lstat(“a”)和yaffs_lstat(“b”)将显示相同的结果,因为他们是同样的事情被引用。 4. 如果我们现在取消链接"a"。该文件不再链接,然后将不再可从"b"。注意与硬链接的区别。 10.6 基于句柄的文件处理 句柄是允许我们访问的常规文件内容的文件访问器。该句柄标识以及下一步在哪里读或写操作将发生位置指针跟踪被访问的文件。 一个句柄标识的值大于或等于 0 的整数。 一个句柄创建通过使用yaffs_open()调用和返回的句柄值。如果不能创建的句柄然后返回一个负的值和设置 yaffs 错误代码。 一个句柄一直有效,直到由yaffs_close()关闭句柄. yaffs_open()调用采用三个参数: § 名称: 被打开的文件的完整路径名称。 § 访问标志: 标志被用来打开此句柄 § 创建模式: 在创建文件时使用的模式标志。 访问标志是一个或多个: O_CREAT 如果不存在,请创建文件。 O_EXCL 仅使用 O_CREAT。如果它不存在,请创建文件。如果该文件已经存在则失败。 O_TRUNC 如果文件存在,并且打开具有写访问权限,然后长截断为零字节文件。     O_APPEND 无论手柄的位置,总是写到文件的结尾。     O_RDWR 读/写访问权限的打开。 O_WRONLY 打开写访问权限和没有读访问权限。     如果 O_RDWR 或 O_WRONLY 既不设置然后会打开文件进行只读访问。 他们并不互相排斥,通常组合这些标志。例如: O_CREAT | O_TRUNC | O_RDWR : 创建一个新文件,如果它不存在否则如果该文件已经存在然后截断长度为零。通常用来覆盖文件或如果它尚不存在,则创建。 O_CREAT | OEXCL | O_WRONLY : 创建一个新文件,打开它的只写的。如果已存在的文件,失败。 有三种模式的标志,可以控制或设置。通过创建该文件的打开或稍后yaffs_chmod()可能会设置这些标志. S_IREAD 可能打开文件进行读取访问权限。 S_IWRITE 可能打开文件进行写访问。 S_IEXEC 可能打开该文件以供执行。这不是通过 yaffs 执行。 一旦您已打开句柄,然后你可以对该文件的各种操作。 yaffs_close(handle) 关闭该句柄。它不再是可用的。 yaffs_fsync(handle) 同花顺出任何缓存写入该文件,因为文件的元数据。 yaffs_datasync(handle) Yaffs_fsync() 但没有文件元数据相同。 yaffs_flush(handle) 和 yaffs_fsync() 一样 yaffs_dup(handle) 复制句柄。 yaffs_lseek(handle, offset, whence) 设置句柄读取/写入位置。请注意这不会修改该文件。你可以寻求该文件的末尾。这不会
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服