copy_to_user和copy_from_user with structs

时间:2011-12-10 15:28:03

标签: linux gcc linux-kernel kernel-module

我有一个简单的问题:当我必须将结构的内容从用户空间复制到内核空间时,例如使用ioctl调用(或反之亦然)(为简单起见,代码没有错误检查):

typedef struct my_struct{
 int a;
 char b;
} my_struct;

用户空间:

my_struct s;
s.a = 11;
s.b = 'X';

ioctl(fd, MY_CMD, &s);

内核空间:

int my_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
             unsigned long arg)
{
...
    my_struct ks;
    copy_from_user(&ks, (void __user *)arg, sizeof(ks));
...
}

我认为用户空间(变量s)和内核空间(变量ks)中的结构大小可能不一样(没有指定__attribute__((packed)))。那么使用copy_from_user宏指定sizeof中的字节数是正确的吗?我看到在内核源代码中有一些结构没有被声明为打包,那么如何确保用户空间和内核空间的大小相同呢?

谢谢大家!

2 个答案:

答案 0 :(得分:1)

为什么结构的布局在内核空间中与用户空间不同?编译器没有理由以不同方式布局数据。 例外情况是用户空间是在64位内核上运行的32位程序。有关如何处理此问题的教程,请参阅http://www.x86-64.org/pipermail/discuss/2002-June/002614.html

答案 1 :(得分:1)

用户空间结构应该来自内核头,因此结构定义在用户和内核空间应该是相同的。你有什么真实的例子吗?

当然,如果你在ABI的两侧玩不同的包装选项,无论它是什么,你都有麻烦。这里的问题不是sizeof。

如果你的问题是:包装选项是否影响二进制接口,答案是肯定的。 如果您的问题是,如何解决包装不匹配问题,请提供更多信息