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

linux – 如何从用户空间调用compat ioctl?任何人都可以提供一些例外吗?,第1张

概述假设我已经定义了以下内容. #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, compa 假设我已经定义了以下内容.

#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,compat_arg1)#define MY_COMPAT_IOCTL_CMD2 _IOW(MAGIC_NUMBER,compat_arg2)#endif

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

ioctl(fd,MY_IOCTL_CMD1,&arg1)

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

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

#ifdef CONfig_COMPATcompat_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.这些仅适用于内核中编译的代码.

总结

以上是内存溢出为你收集整理的linux – 如何从用户空间调用compat ioctl?任何人都可以提供一些例外吗?全部内容,希望文章能够帮你解决linux – 如何从用户空间调用compat ioctl?任何人都可以提供一些例外吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1025903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存