橘本橘橘猫 2023-01-28 18:39 采纳率: 25%
浏览 80
已结题

eMMC&Android&C&Linux

问题:
Open读取文件,有设置O_DIRECT,但是实际Read的时候,仍然使用了PageCache,而不是直接操作磁盘,这是为何?

背景:
1: 题主用的是安卓手机,采用eMMC内存,我想对手机的eMMC内存进行压力测试(一直读写数据)
2:eMMC内存有两种模式:Normal模式和Command Queue模式,
3:题主对Normal模式的eMMC内存可以实现直接访问磁盘,对Command Queue模式的eMMC内存,无法直接从磁盘读取数据(采用了PageCache)
4:明明有设置O_DIRECT,Normal模式有直接读取磁盘的信息,而Command Queue模式却不会直接访问磁盘,先访问PageCache

代码
fileReadHandle = open(filePath, O_RDONLY | O_DIRECT | O_NOCTTY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);//获取文件句柄
readLength = read(fileReadHandle,jbArray,length);//Read操作,长度为1024 * 1024 = 1MB

我想要的结果:
如何让我的Read操作直接去访问磁盘设备?为何我的O_DIRECT会失效?

  • 写回答

6条回答 默认 最新

  • 哇小侠 2023-01-29 00:35
    关注

    O_DIRECT 标志用于绕过页面缓存并直接访问底层存储设备。然而,在您的情况下,可能有几个原因导致它无法正常工作。

    一个原因可能是您的文件系统不支持直接 I/O。一些文件系统(如 ext4)不支持 O_DIRECT,并将忽略该标志。

    另一个原因可能是文件系统或设备驱动程序不支持 O_DIRECT 的对齐要求。O_DIRECT 要求传递给 read 或 write 系统调用的缓冲区与存储设备的物理块大小对齐。如果缓冲区不对齐,驱动程序可能会回退到使用页面缓存。

    最后,该问题也可能由您的安卓设备使用的特定 eMMC 内存控制器引起。一些控制器可能不支持直接 I/O,或者可能有不同的对齐要求。

    可能是你的设备的 eMMC 控制器使用了 Command Queue 模式,该模式可能不支持 O_DIRECT。在这种模式下,eMMC 内存控制器使用队列来调度命令并管理存储设备的访问。该模式可能不支持直接 I/O,因此 O_DIRECT 标志可能会被忽略。

    为了确认您的设备的 eMMC 控制器是否支持 O_

    首先要确定的是,O_DIRECT是在linux系统中定义的一个文件操作标志,用于告诉内核不要使用page cache来缓存读写操作。然而,并不是所有的文件系统都支持O_DIRECT标志。在某些文件系统中,O_DIRECT标志被忽略,或者只有在文件打开时才有效。另外,在某些文件系统中,O_DIRECT标志只对读操作有效,对写操作无效。

    在安卓系统中,内核是基于linux内核的,所以O_DIRECT标志也是可用的。然而,你提到的eMMC内存有两种模式:Normal模式和Command Queue模式,这两种模式对于O_DIRECT标志的支持是不同的。对于Normal模式的eMMC内存,O_DIRECT标志是有效的,可以直接访问磁盘。而对于Command Queue模式的eMMC内存,O_DIRECT标志是无效的,无法直接从磁盘读取数据。

    如果你想要在Command Queue模式的eMMC内存上直接访问磁盘,那么你需要查找其它的解决方案。比如,可以使用IOCTL系统调用来控制eMMC内存的读写操作,或者使用特定的驱动来实现磁盘直接访问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 2月8日
  • 已采纳回答 1月31日
  • 创建了问题 1月28日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料