带有结构的 copy_to_user 和 copy_from_user

发布于 2024-12-20 16:40:34 字数 732 浏览 1 评论 0原文

我有一个简单的问题:当我必须将结构的内容从用户空间复制到内核空间时,例如使用 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))) 。那么,使用 sizeof 宏指定 copy_from_user 中的字节数是否正确呢?我发现在内核源代码中有些结构未声明为打包,因此如何确保用户空间和内核空间中的大小相同?

谢谢大家!

I have a simple question: when i have to copy a structure's content from userspace to kernel space for example with an ioctl call (or viceversa) (for simplicity code hasn't error check):

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

Userspace:

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

ioctl(fd, MY_CMD, &s);

Kernelspace:

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));
...
}

i think that size of structure in userspace (variable s) and kernel space (variable ks) could be not the same (without specify the __attribute__((packed))). So is a right thing specifing the number of byte in copy_from_user with sizeof macro? I see that in kernel sources there are some structures that are not declared as packed so, how is ensured the fact that the size will be the same in userspace and kernelspace?

Thank you all!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

掩耳倾听 2024-12-27 16:40:34

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

Why should the layout of a struct be different in kernel space from user space? There is no reason for the compiler to layout data differently.
The exception is if userspace is a 32bit program running on a 64bit kernel. See http://www.x86-64.org/pipermail/discuss/2002-June/002614.html for a tutorial how to deal with this.

我们只是彼此的过ke 2024-12-27 16:40:34

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

当然,如果您在 ABI 的两侧使用不同的打包选项,无论它是什么,您都会遇到麻烦。这里的问题不是sizeof。

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

The userspace structure should come from kernel header, so struct definition should be the same in user and kernel space. Do you have any real example ?

Of course, if you play with different packing options on two side of an ABI, whatever it is, you are in trouble. The problem here is not sizeof.

If your question is : does packing options affect binary interface, the answer is yes.
If your question is, how can I solve a packing mismatch, please provide more information

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文