您好
我目前正在编写一个软件来测试闪存设备的完整性。 (使用c ++ iostreams)
为实现此目标,将具有随机内容的文件写入设备,进行回读,复制,移动,比较(我将设备置于压力状态,并检查数据是否有效)... <登记/> 外面的一切看起来都很棒,但窗帘后面有一个问题。
当我分析通过ATA / SATA电缆(使用Bus Doctor)发送到设备的命令时,我发现(特别是)读取命令通常不会被执行。然而,该数据可用于该计划。所以他们必须来自缓冲区,这在我的情况下是不可接受的。每当我读取数据时,它必须直接来自磁盘,而不是来自缓存。读/写性能根本不重要。
但我还没有办法告诉Windows不要缓冲任何内容(可以选择在设备管理器中停用特定设备的写入缓存,但没有达到预期效果)。
如果有人知道怎么做:请告诉我
(关于Linux的任何建议也一样。我想我会遇到同样的问题)
到目前为止我唯一能提出的解决方案是Direct I / O. 我在Windows上找到的是:
http://www.internals.com/utilities_main.htm
WinIo库允许32位Windows应用程序直接访问I / O端口和物理内存。它通过结合使用内核模式设备驱动程序和几种低级编程技术来绕过Windows保护机制。
Direct I / O是世界上第一个用于Microsoft Windows NT,Windows 2000,Windows XP和Windows Server 2003的设备驱动程序,它可以为您现有的软件提供直接硬件访问,而无需您进行任何编程工作
问题:
有人有类似的问题,可以给我一些建议吗?
我是否真的必须使用直接I / O或是否有一些我没有找到的操作系统选项/设置(Windows或Linux)
您是否了解Direct I / O的其他库(Windows或Linux甚至更好:两者)
答案 0 :(得分:1)
对于Windows,您可以直接disable buffering using the Win32 API。
打开或创建文件时 CreateFile函数, FILE_FLAG_NO_BUFFERING标志可以 指定禁用系统缓存 数据被读取或写入 文件。虽然这给出了完整的和 直接控制数据I / O. 缓冲,在文件和 类似的设备有数据 必须的对齐要求 考虑。
不确定是否可以在C ++标准库中完成此操作。您可以在iostream级别禁用缓冲,但这可能不会影响O / S缓冲。
答案 1 :(得分:1)
在Linux下,您可以在打开设备时使用O_DIRECT标志,然后所有访问都将绕过页面缓存并直接转到设备。
请注意,O_DIRECT读取和写入必须与内存地址,文件偏移量和读/写请求大小中设备的块大小(通常为512字节)对齐。
答案 2 :(得分:0)
您可以在/ proc / kcore下访问Linux中的内存中的任何位置。因此,如果您知道设备的内存映射到哪个地址(您可以通过/ proc目录查看更多信息),您可以直接读取/写入。