我有一个简单的问题:当我必须将结构的内容从用户空间复制到内核空间时,例如使用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
中的字节数是正确的吗?我看到在内核源代码中有一些结构没有被声明为打包,那么如何确保用户空间和内核空间的大小相同呢?
谢谢大家!
答案 0 :(得分:1)
为什么结构的布局在内核空间中与用户空间不同?编译器没有理由以不同方式布局数据。 例外情况是用户空间是在64位内核上运行的32位程序。有关如何处理此问题的教程,请参阅http://www.x86-64.org/pipermail/discuss/2002-June/002614.html。
答案 1 :(得分:1)
用户空间结构应该来自内核头,因此结构定义在用户和内核空间应该是相同的。你有什么真实的例子吗?
当然,如果你在ABI的两侧玩不同的包装选项,无论它是什么,你都有麻烦。这里的问题不是sizeof。
如果你的问题是:包装选项是否影响二进制接口,答案是肯定的。 如果您的问题是,如何解决包装不匹配问题,请提供更多信息