jffs2 Linux 文件系统上的 O_DIRECT 支持
Posted
技术标签:
【中文标题】jffs2 Linux 文件系统上的 O_DIRECT 支持【英文标题】:O_DIRECT support on a jffs2 Linux filesystem 【发布时间】:2011-05-17 11:19:14 【问题描述】:我正在尝试使用 O_DIRECT 打开文件,我们正在使用 jffs2
fd = open(filename, O_RDONLY|O_DIRECT|O_SYNC);
但我只收到“无效参数”错误。 我也尝试过解决方案 in this SO link 但无济于事。 当然,我在构建源代码时也加入了“-D_GNU_SOURCE”。
我了解到 tmpfs 不支持 O_DIRECT,但找不到对 jffs2 的支持或不支持。 如果有人可以给我证明或不证明 jffs2 支持和/或我缺少的任何其他东西来使 O_DIRECT 工作。
注意:
这一切都发生了,因为当我使用 fread()/read() 时,Linux 似乎会自行缓存内存数据。
并且使用system("echo 3 > /proc/sys/vm/drop_caches");
为时已晚,因为我不希望FS 首先分配缓存。
谢谢, 纳兹
【问题讨论】:
【参考方案1】:jffs2 不支持O_DIRECT
。
您can see in __dentry_open()
,为了支持O_DIRECT
,文件系统必须提供address_space_operations
结构的direct_IO
和/或get_xip_mem
成员。你同样可以看到jffs2 does not supply these members。
尚不清楚您为何如此热衷于避免页面缓存。页面缓存中的页面实际上是“空闲的”——当需要更多内存用于其他用途时,它们将被回收。
【讨论】:
感谢您的即时回复。现在我学到了一些关于 Linux 文件系统的新东西。我们实际上将它用于嵌入式系统,并且只有 32mb 的内存空间。使用运行时文件、系统文件和缓存的运行时文件,剩下不到 20mb,我想尽量减少使用的内存。以便最大化传入的附加项目文件。使用 Linux 缓存文件,我无法加载超过 10mb 的文件。 @Naze Kimi:页面缓存中的页面不会饿死内存中的其他内容 - 如果需要更多内存,这些页面将被驱逐,这就是它们本质上等同于空闲内存的原因。您是否尝试过使用mmap()
而不是使用read()
映射文件?这会将页面缓存页面直接映射到您的进程地址空间。
“页面缓存中的页面不会饿死其他内存” - 我知道它这么说,但它确实会占用内存。另外还有fread()/read()在文件超过一半可用内存时返回错误的问题。我确实在 mmap() 上尝试了您的建议,虽然文件已加载,但我在程序的其他进程上遇到错误。无论如何, mmap() 可能正是我所需要的。再次感谢。以上是关于jffs2 Linux 文件系统上的 O_DIRECT 支持的主要内容,如果未能解决你的问题,请参考以下文章
linux中常用文件系统介绍——cramfs JFFS2 NFS initrd yaffs2 Ext4 squashfs