Yaffs功能说明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

▪ 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 测试配置。

Nand 闪存仿真使用一个文件作为后备存储。

yaffs_fileem.c
yaffs_fileem2k.c
yaffs_norif1.c 亦不闪光模拟和接口的示例。

这被配置为M18 闪光。

yaffs_ramdisk.c
使用RAM模拟.
yaffs_ramem2k.c
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 中指定的空闲字节数和字节的使用之间的映射
曾经在许多NOR Yaffs1 模型——基于系统。

一个特别是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文本块中的数据字节数。

只有有效的数据块
以下字段才有意义,当我们读到
▪eccResult ECC 检查阅读时的结果
▪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 执行。

一旦您已打开句柄,然后你可以对该文件的各种操作。

相关文档
最新文档