如何调用 compat_ioctl 或 unlocked_ioctl?

Posted

技术标签:

【中文标题】如何调用 compat_ioctl 或 unlocked_ioctl?【英文标题】:How to call compat_ioctl or unlocked_ioctl? 【发布时间】:2014-05-17 07:12:43 【问题描述】:

我正在尝试实现 RTC(实时时钟)驱动程序。我在kernel 2.6.32 中使用了ioctl 函数。它工作得很好。但是当我在内核 3.13.0 中运行相同的驱动程序时,它给出了一个错误‘struct file_operations’ has no member named ‘ioctl’

当我将ioctl 更改为unlocked_ioctlcompat_ioctl 时,编译并插入了模块。

但是在用户应用程序中调用ioctl 没有在模块中调用ioctl 函数。我必须在用户应用程序中使用什么函数来调用compat_ioctlunlocked_ioctl

【问题讨论】:

用 unlocked_ioctl 的参数验证 【参考方案1】:

检查驱动程序中的参数

define结构文件操作定义like

static struct file_operations query_fops =

    .owner = THIS_MODULE,
    .open = my_open,
    .release = my_close,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
    .ioctl = my_ioctl
#else
    .unlocked_ioctl = my_ioctl
#endif
;

像定义ioctl一样

#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
static int my_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
#else
static long my_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
        #endif
    
              switch(cmd)
                ....................................
                ...................................
              
    

和应用层

无需做任何修改,您可以在应用程序级别遵循ioctl的基本规则。

【讨论】:

给予error: missing binary operator before token "(" 你能插入模块吗???您到底在哪里得到错误应用程序端或驱动程序端? 抱歉,我忘了包含linux/version.h 我建议使用下面的宏而不是版本检查,#ifdef HAVE_UNLOCKED_IOCTL .... #endif

以上是关于如何调用 compat_ioctl 或 unlocked_ioctl?的主要内容,如果未能解决你的问题,请参考以下文章

unlocked_ioctl和compat_ioctl

ioctl接口 -26

iOS利用Jenkins实现自动化打包(SVN版)

GUC-7 同步锁 Lock

Linux驱动调试中关于ioctl的问题

std::mutex的一些性能疑问