copy_to_user和copy_from_user与结构

我有一个简单的问题:当我必须从用户空间拷贝一个结构的内容到内核空间,例如用一个ioctl调用(反之亦然)(为了简单,代码没有错误检查):

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

用户空间:

 my_struct s; sa = 11; sb = '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)); ... } 

我认为用户空间(variabless )和内核空间(variablesks )中的结构大小可能不一样(没有指定__attribute__((packed)) ))。 那么用sizeofmacros指定copy_from_user的字节数是正确的吗? 我发现在内核源代码中有一些没有被声明为压缩的结构,如何确保在用户空间和内核空间中大小相同的事实?

谢谢你们!

为什么一个结构的布局在内核空间与用户空间不同? 编译器没有理由对数据进行不同的布局。 用户空间是一个运行在64位内核上的32位程序是个例外。 请参阅http://www.x86-64.org/pipermail/discuss/2002-June/002614.html教程如何处理这个。

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

当然,如果你在ABI的两面玩不同的包装,你会遇到麻烦。 这里的问题不是sizeof。

如果你的问题是:打包选项是否影响二进制界面,答案是肯定的。 如果您的问题是,我怎样才能解决包装不匹配,请提供更多的信息