0

我正在使用此函数将一些结构复制到内核。但是,问题是我必须复制三个数据结构,它们是更大数据结构的一部分。注意:这 3 个数据结构在更大的数据结构中是连续的。

所以,在我的复制用户函数中,我传递第一个数据结构的指针并给出所有 3 个数据结构的长度。但是,当我进入用户空间并打印第二个数据结构的第一个元素时,它会给出一些其他值。

所以,我做错了什么。作为一个解决方案,我进行了 3 次 copt_to_user 调用,令我惊讶的是它运行良好。这是我进行一次 copy_to_user 调用时的问题。

请让我知道可能是什么原因。

嘿,谢谢大家的回答,这是一个对齐问题,但是,更进一步,如果我想填充内部结构,我该怎么做..?例子-

结构化的{

结构 b;

结构 c; //我想把这个结构做成一个填充的,怎么做?

结构d;

}

4

1 回答 1

2

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

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

于 2012-07-28T15:31:04.957 回答