【问题标题】:linux kernel function _copy_to_user, want clear understanding of thatlinux内核函数_copy_to_user,想清楚了解
【发布时间】: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


【解决方案1】:

正如 cmets 中提到的,这似乎确实是一个对齐问题。 Gcc 可能会在结构 d 中的结构 a、b 和 c 之间添加一些填充。根据您在用户空间中实例化的方式,这可能是一个问题。您可以强制 gcc 不生成填充,在您的结构上使用 __atribute__ ((packed)),但除非此结构映射到硬件寄存器,否则这通常不是一个好主意,因为它会在访问该结构的字段时导致性能下降。

另一个可能的问题是如果您的内核是 64 位,而您的用户态程序是 32 位,在这种情况下,您需要使用固定大小的类型来确保具有相同的布局。

【讨论】:

  • 您好,感谢您的回答,您能否再次检查该问题,因为我已对其进行了编辑。谢谢
猜你喜欢
  • 1970-01-01
  • 2014-02-05
  • 2013-10-20
  • 2012-07-21
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
相关资源
最近更新 更多