运维开发网

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

运维开发网 https://www.qedev.com 2020-05-19 08:45 出处:网络
假设我已经定义了以下内容. #define MY_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, arg1) #define MY_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, arg2)
假设我已经定义了以下内容.

#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

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

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

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

在用户空间应用程序中永远不需要使用compat_arg1或MY_COMPAT_IOCTL_CMD1.这些仅适用于内核中编译的代码.

0

精彩评论

暂无评论...
验证码 换一张
取 消