【问题标题】:Linux character type device driver , when the flush call will be madeLinux字符类型设备驱动程序,何时进行刷新调用
【发布时间】:2023-04-07 20:43:01
【问题描述】:

我有一个 linux char 设备驱动程序,在日志中我可以看到在驱动程序中调用了刷新函数,尽管我们从未在应用程序中显式调用刷新。

何时调用刷新调用而不是释放调用。在哪些情况下会自动触发刷新调用?

从文档中我们可以理解

当进程关闭设备的文件描述符副本时,会调用刷新操作;它应该在设备上执行(并等待)任何未完成的操作。这不能与用户程序请求的 fsync 操作相混淆。目前,flush 仅在网络文件系统 (NFS) 代码中使用。如果 flush 为 NULL,则根本不会调用它。

但想深入了解。 我们使用linux 2.6.10

【问题讨论】:

    标签: linux linux-device-driver kernel-module


    【解决方案1】:

    简单地说,文件对象的刷新方法在任何一个 close() 上调用,当打开的文件对象 (FTE) 的引用计数降至零时调用释放方法。

    为了更好地理解这一点,请考虑一个进程打开(设备)文件(第一次)并随后调用 fork() 的场景。

    伪代码:

    int fd = open("/dev/xxxxx", O_...);
    ...
    fork()
    ...
    

    这将导致打开文件描述符表 (OFDT) 的引用计数保持为 1(因为它被复制到子进程中),但 FTE 的(“打开文件”对象 - 它指向)引用计数会增加到 2,因为父进程和子进程现在都持有对它的引用。

    如果他们中的任何一个现在通过调用关闭文件

    close(fd);
    

    该进程对该文件的句柄将被关闭,FTE 引用计数将减少到 1,并且内核 VFS 将调用 flush() 方法!如果其他进程也关闭了文件,则引用计数将降至零,此时将调用 flush() release()。 HTH。

    【讨论】:

    • 要在子进程退出时添加flush()/release()调用,而不是在驱动程序句柄上显式调用close。
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2014-05-18
    相关资源
    最近更新 更多