【问题标题】:mandatory functions of ‘struct file_operations’‘struct file_operations’的强制功能
【发布时间】:2019-01-18 08:39:46
【问题描述】:

我正在尝试了解 Linux 内核字符设备驱动程序 背后的概念。基本上我想向用户模式程序公开一个 IOCtl。我实现了一个 'struct file_operations->unlocked_ioctl' 和 dummy 'struct file_operations->open, ->close' 回调我的意思是这些 ->open, - >close 回调总是返回 true 而没有任何其他逻辑)。所以我怀疑我真的需要保留这些 API 吗?我尝试在内核模式驱动程序中删除这些 ->open->close 回调,但我仍然能够从用户模式访问 IOCtl 函数。我想知道在这种情况下要公开的“struct file_operations”的所有强制性功能是什么。有人可以澄清一下吗?

【问题讨论】:

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


    【解决方案1】:

    struct file_operations对象中none的回调函数是强制

    当 VFS(虚拟文件系统)发现某个函数为 NULL 时,它可能会将其解释为 默认实现(例如 .open().close() 默认只返回 0)或“for given文件,给定的功能不支持”(例如,缺少.write() 和一些其他字段意味着给定的文件不支持写入它)。

    仅填写实现所需功能所需的那些函数。


    struct file_operations 中唯一推荐填写的字段是owner 字段。在大多数情况下,它应该设置为THIS_MODULE

    .owner = THIS_MODULE
    

    这样可以保护其他回调函数免受模块的卸载

    【讨论】:

    • 感谢您的澄清。关于 struct file_operations 中的 '.owner = THIS_MODULE' 字段,如果我们不填写该字段会怎样,请您提供更多详细信息。
    • 如果没有设置.owner 字段,某些进程可能会使用文件(例如,执行.unlocked_ioctl 函数)但其他一些进程会同时卸载模块。卸载模块意味着取消映射模块的代码和数据,所以.unlocked_ioctl函数的执行会触发页面错误。使用.owner = THIS_MODULE,如果任何进程使用该文件,则无法卸载模块。
    • 感谢您的回复。我知道将 struct file_operations .owner 归档设置为 THIS_MODULE 可以防止模块在运行时被卸载。因此,我尝试从 struct file_operations 中删除此 '.owner = THIS_MODULE' 字段,并在其他进程使用该文件时触发了 'rmmod',但我注意到 rmmod 失败,即“rmmod: ERROR: Module test_module is in use”。但我不知道为什么 rmmod 失败了?
    • 可能你使用了其他机制来阻止模块被卸载。不看代码很难说更多。
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2012-05-27
    • 2012-06-25
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多