使用在用户程序的Linux / types.h中,或者在驱动模块代码stdint.h ...什么关系

2019-08-08 10:03发布

我正在开发一个设备驱动模块和相关的用户库,以处理的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包括在用户空间代码?
  2. 它是一个坏主意,在内核空间代码使用stdint.h?
  3. 如果回答这两个是肯定的,那么我该如何处理这种情况的含uint32_t的结构是由用户库和驱动器模块都共享的情况呢?

谢谢。

Answer 1:

  1. 它是一个坏主意,使用Linux / * H包括在用户空间代码?

是的,通常。 典型的情况是,你应该使用C库头(在这种情况下, stdint.h和朋友),以及接口与C库尽管这些用户空间的类型,并让图书馆手柄通过内核内核说话类型。

你在一个典型的情况是不是虽然。 在你的情况,你正在编写的驱动程序库 。 所以,你应该呈现的接口使用用户空间stdint.h ,但使用linux/*.h时,接口到你的内核驱动程序标题。

因此,答案是否定的,你的情况。

  1. 它是一个坏主意,在内核空间代码使用stdint.h?

最绝的是。

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



Answer 2:

在Linux内核中的固定长度整数

Linux内核已经有这你可能感兴趣的固定长度的整数。 在V4.9下include/asm-generic/int-ll64.h

typedef signed char s8;
typedef unsigned char u8;

typedef signed short s16;
typedef unsigned short u16;

typedef signed int s32;
typedef unsigned int u32;

typedef signed long long s64;
typedef unsigned long long u64;

LDD3有一个关于数据的大小章,以及: https://static.lwn.net/images/pdf/LDD3/ch11.pdf

LDD3提到那里的最好printk策略是转换为只投给可能的正确的符号性的最大整数: %lld%llu%ju会出现下不可用printk格式核心lib/linux/vsprintf.c



文章来源: Using linux/types.h in user programs, or stdint.h in driver module code…does it matter?