在用户程序中使用linux/types.h,或在驱动程序模块代码中使用stdint.h ...这有关系吗?

Rob*_*Rob 10 linux linux-device-driver linux-kernel

我正在开发一个设备驱动程序模块和相关的用户库来处理ioctl()调用.该库获取相关信息并将其放入一个结构中,该结构被传递到驱动程序模块并在那里解压缩然后处理(我省略了很多步骤,但这是整体想法).

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

在我看来,linux/types.h的意思是在内核文件中定义类型,所以我不确定这是否意味着使用stdint.h是不好的主意.我还发现,当我在我的驱动程序模块中使用stdint.h时,我得到了关于重新定义的编译错误,即使我用stdint.h替换linux/types.h的所有实例(并把它放在上面)也不会消失包含订单的顶部).

洙....

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

谢谢.

she*_*heu 6

  1. 在用户空间代码中使用 linux/*.h 包含是一个坏主意吗?

是的,通常。典型的情况是你应该使用 C 库头文件(在这种情况下,stdint.h和朋友),并通过那些用户空间类型与 C 库接口,并让库通过内核类型处理与内核的对话。

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

所以答案是否定的,就你而言。

  1. 在内核空间代码中使用 stdint.h 是个坏主意吗?

绝对是的。

另见:http : //lwn.net/Articles/113349/