如何从用户空间调用compat ioctl?任何人都可以提供一些例外吗?

时间:2011-06-07 05:17:30

标签: linux kernel

假设我已经定义了以下内容。

#define MY_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, arg1)
#define MY_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, arg2)
#ifdef CONFIG_COMPAT
#define MY_COMPAT_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, compat_arg1)
#define MY_COMPAT_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, compat_arg2)
#endif

现在当我们从用户空间进行ioctl时,我们通常会这样做

ioctl(fd, MY_IOCTL_CMD1, &arg1)

问:我们真的需要一个MY_COMPAT_IOCTL_CMD1作为请求的ioctl吗?

在devide代码中,我的处理程序定义如下。 ioctl:device_ioctl

#ifdef CONFIG_COMPAT
compat_ioctl: device_compat_ioctl
#endif

有人可以就此提供一些解释吗?

1 个答案:

答案 0 :(得分:6)

这个compat用于在64位内核中运行32位程序。当您从64位内核上的32位程序调用{​​{1}}时,内核会将ioctl转移到ioctl(fd, MY_IOCTL_CMD1, &arg1)结构中的.compat_ioctl函数。此file_operations函数负责复制用户参数compat_ioctl,就像使用32位布局的arg1一样。 compat_arg1 typedef在内核中定义,因此在编译为64位时,结构与为32位编译的compat_arg1完全相同。

创建cmd ID时,arg1的定义会考虑MY_IOCTL_CMD1。编译32位计算机的程序时,sizeof arg1的值将与为64位计算机编译时的值不同。但是,32位MY_IOCTL_CMD1应该与内核中的64位MY_IOCTL_CMD1具有相同的值。

从不需要在用户空间应用程序中使用MY_COMPAT_IOCTL_CMD1compat_arg1。这些仅适用于在内核中编译的代码。