【发布时间】:2012-07-26 21:20:38
【问题描述】:
我正在使用这个函数将一些结构复制到内核。 但是,问题是我必须复制三个数据结构,它们是更大数据结构的一部分。注意:这 3 个数据结构在更大的数据结构中是连续的。
所以,在我的复制用户函数中,我传递第一个数据结构的指针并给出所有 3 个数据结构的长度。但是,当我进入用户空间并打印第二个数据结构的第一个元素时,它会给出一些其他值。
所以,我做错了什么。 作为一个解决方案,我进行了 3 次 copt_to_user 调用,令我惊讶的是它运行良好。当我进行一次 copy_to_user 调用时,问题就来了。
请告诉我可能是什么原因。
大家好,感谢您的回答,这是一个对齐问题,但是,更进一步,如果我想填充内部结构,我该怎么做..? 例子-
结构 d{
结构 b;
结构 c; //我想把这个结构做成一个填充的,怎么做?
结构 d;
}
【问题讨论】:
-
很难说出你在问什么。给我们看一些代码?
-
结构一个;结构 b;结构 c; struct d{struct a;struct b;struct c;} ..... 然后我调用 copy_to_user(pointer_in_user, &a, len).. where len=sizeof(struct a)+sizeof(struct b)+sizeof(struct c ).... 但是,只看到 a 的值,并且 struct b 和 struct c 的值搞砸了。希望你明白我的意思。
-
编辑问题,不要添加为评论。
-
听起来像是对齐问题,但没有代码就无法分辨。让我强调一下:我们需要实际的结构定义以及您如何复制才能判断它是否存在对齐问题。
-
@Invictus:正如 Quentin 在他的回答中提到的,你可能有填充问题,我会做的快速尝试: len = sizeof(struct d) 代替
标签: linux linux-kernel linux-device-driver virtual-address-space