gpt4 book ai didi

linux - 在用户程序中使用 或在驱动程序模块代码中使用 ……这有关系吗?

转载 作者:IT王子 更新时间:2023-10-29 00:07:33 26 4
gpt4 key购买 nike

我正在开发一个设备驱动程序模块和相关的用户库来处理 ioctl()电话。该库获取相关信息并将其放入一个结构中,该结构被传递到驱动程序模块并在那里解包,然后进行处理(我省略了很多步骤,但这就是总体思路)。

一些数据通过 ioctl() 通过结构传递是uint32_t类型。我发现该类型是在 <stdint.h> 中定义的和 <linux/types.h> .到目前为止,我一直在使用 <linux/types.h>定义该值,包括在用户库中。但我知道使用 <linux/*.h> 是不好的形式用户空间中的库,所以如果我删除它们并使用 <stdint.h>相反,当我的驱动程序模块包含结构定义时,它必须包含 <stdint.h>还有。

在我看来,<linux/types.h> 的意义在于是在内核文件中定义类型,所以我不确定这是否意味着使用 <stdint.h>那里是个坏主意。我还发现,在尝试使用 <stdint.h> 编译我的驱动程序模块时,即使我替换了 <linux/types.h> 的所有实例,我也会收到有关重新定义的编译错误,这些错误不会消失。与 <stdint.h> (并将其放在包含顺序的顶部)。

  1. 在用户空间代码中使用 linux/*.h includes 是个坏主意吗?
  2. 使用 <stdint.h> 是个坏主意吗?在内核空间代码中?
  3. 如果这两个问题的答案都是肯定的,那么我该如何处理结构包含 uint32_t 的情况?由用户库和驱动模块共享?

最佳答案

  1. Is it a bad idea to use linux/*.h includes in user-space code?

是的,通常。典型情况是您应该使用 C 库 header (在本例中为 stdint.h 和 friend ),并通过那些用户空间类型与 C 库接口(interface),并让库通过内核类型处理与内核的对话。

不过,您的情况并不典型。在您的情况下,您正在编写驱动程序库。因此,您应该使用 stdint.h 向用户空间呈现接口(interface),但在与内核驱动程序接口(interface)时使用 linux/*.h header 。

因此,在您的情况下,答案是否定的。

  1. Is it a bad idea to use stdint.h in kernel-space code?

绝对是。

另请参阅:http://lwn.net/Articles/113349/

关于linux - 在用户程序中使用 <linux/types.h> 或在驱动程序模块代码中使用 <stdint.h> ……这有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com