C 如何在NAND中向文件写入几个字节而不连续破坏页面?

C 如何在NAND中向文件写入几个字节而不连续破坏页面?,c,C,我有一个持久的字典字符串->字符串映射,作为日志文件写入NAND文件系统。我的二进制格式是: 1 byte - key size <key size> bytes - key without the terminating nul-character 2 bytes - value size and flags <value size> bytes - value without terminating nul-character 通常,我在字典中每次更改都会写入20到

我有一个持久的字典字符串->字符串映射,作为日志文件写入NAND文件系统。我的二进制格式是:

1 byte - key size
<key size> bytes - key without the terminating nul-character
2 bytes - value size and flags
<value size> bytes - value without terminating nul-character
通常,我在字典中每次更改都会写入20到100个字节。但是,由于这是在NAND上持久化的,所以这种设计每次都会分配一个新页面,每次迭代都会将可用的NAND空间减少2k

我不能缓存写操作,因为我不能丢失这些数据。它是销售终端的运行点,保存交易数据。我的算法有效地写入和调用flush,所以不会发生这种情况


现在,有一个事实上的或标准的算法来解决这个问题吗?我已经研究了目标平台上的掉电触发器,但SDK建议使用NAND作为持久层。

嗯。。。只需跟踪您在页面中的位置,在写入之前,读入最后一页,将新数据追加到内存中,然后将同一页写回

如果新数据超出了页面限制,请从新页面开始。如果新数据不适合写入最后一页的剩余空间,则会发生这种情况。完成后,更新有关上次写入发生位置的信息

你说你的追加每次都会导致分配一个新的页面,我不知道如果你追加到一个字节序列,为什么会出现这种情况


当然,这需要对内存进行页级访问。如果您只有像C的file*函数那样的文件级访问,那么除非您知道您的文件层有点聪明,否则您就无法做到这一点。

由于NAND闪存在写操作上仅限于页面粒度,所以我运气不佳。 我可以依赖一些外部持久性设备,或者关闭例程,但我无法访问任何其他辅助内存,旧的销售点终端甚至有电容器用于最后的例程,但它们对于事务数据来说不够可靠


我不得不忍受闪光灯的限制。

如果突然断电,断电触发器可能不会触发,所以你不能依赖任何这样的东西。是的,一些旧的终端也有电容器,但它们现在不可靠,在街上运行了很多年。甚至。。。一些旧的终端甚至有电容器……你能说说目标平台是什么吗?根据WinCE?、Linux?、VXWorks?、QNX等操作系统的不同,您的选项会有很大的不同?我们必须支持8个平台,有很多不同的终端型号。我们支持VeriFone、Sagem、Ingenico、Hypercom、PAX、Perto、Intelligent和Windows的终端,这是一个内部开发的虚拟终端。解释页面中断意味着什么是正确的。否则答案真的很混乱。@JanHudec谢谢,我想我忘了一些单词或其他什么。希望现在更清楚…我只是有一个缓冲文件API。页面大小为2k,但根据文档,内部缓冲区限制为512字节。无论如何,我需要在每次写入后立即刷新数据,因此在这种情况下,我在每次写入后调用flush函数@放松:你是在告诉我要保留一个页面边界,在每次写入磁盘之前,先写入一个内部缓冲区,然后寻找这个存储的页面边界,所以我总是写一整页?你是说底层会识别被覆盖的部分是相同的,因此不会破坏当前页面吗?@Spidey:如果你只有一个缓冲文件API,那么你就无法控制flash的功能。在这种情况下,底层要么执行unwind描述的操作,要么就是运气不好。如果没有,您唯一的机会就是与操作系统供应商协调。我想我在这种情况下运气不好。我们计划将字典持久化为NOR闪存,但我们有一个NAND闪存,具有页面写入粒度。