你好
我目前正在编写一个软件来testing闪存设备的完整性。 (使用c ++ iostreams)
为了实现这个目标,将随机内容的文件写入设备,读回,复制,移动,比较(我把设备置于压力状态下,并检查数据是否有效)
外面的一切看起来都很棒,但窗帘后面有一个问题。
当我分析通过ATA / SATA电缆(带有总线医生)发送给设备的命令时,我发现(特别是)读命令通常不会被执行。 尽pipe如此,数据是可用的程序。 所以他们必须来自缓冲区,这在我的情况是不可接受的。 每当我读数据,它必须直接从磁盘,而不是caching。 读/写性能并不重要。
但我还没有find一种方法告诉Windows不要缓冲任何东西(可以select在设备pipe理器中禁用特定设备的写入caching,但不具有所需的效果)。
如果有人知道如何做到这一点,请告诉我
(关于Linux的任何build议也是一样,我想我会遇到同样的问题)
只有解决scheme,我可以想出到目前为止,直接I / O。
我发现的Windows是这样的:
http://www.internals.com/utilities_main.htm
WinIo库允许32位Windows应用程序直接访问I / O端口和物理内存。 它通过使用内核模式设备驱动程序和几个低级编程技术的组合来绕过Windows保护机制。
和http://www.direct-io.com/
Direct I / O是世界上第一款适用于Microsoft Windows NT,Windows 2000,Windows XP和Windows Server 2003的设备驱动程序,可以直接访问现有软件,无需任何编程工作
问题:
有人曾经有类似的问题,可以给我一些build议吗?
我真的必须去直接I / O或有没有find一些操作系统选项/设置(Windows或Linux)
你知道其他的直接I / O库(Windows或Linux,甚至更好)
对于Windows,您可以直接禁用使用Win32 API的缓冲 。
使用CreateFile函数打开或创建文件时,可以指定FILE_FLAG_NO_BUFFERING标志以禁用从文件读取或写入文件的数据的系统缓存。 虽然这可以完全和直接地控制数据I / O缓冲,但在文件和类似设备的情况下,必须考虑数据对齐要求。
不知道这是否可以在C ++标准库中完成。 您可以禁用iostream级别的缓冲,但这可能不会影响O / S缓冲。
在Linux下,您可以在打开设备时使用O_DIRECT标志,然后所有的访问将绕过页面缓存并直接进入设备。
请注意,O_DIRECT读写操作必须与内存地址,文件偏移量和读/写请求大小中的设备块大小(通常为512字节)对齐。
您可以在Linux下的/ proc / kcore下访问内存中的任何位置。 所以如果你知道你的设备的内存映射到哪个地址(你可以通过查看/ proc目录来找到更多的东西),你可以直接读/写它。