如何调用 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_ioctl
和compat_ioctl
时,编译并插入了模块。
但是在用户应用程序中调用ioctl
没有在模块中调用ioctl
函数。我必须在用户应用程序中使用什么函数来调用compat_ioctl
或unlocked_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?的主要内容,如果未能解决你的问题,请参考以下文章