我正在开发一个设备驱动模块和相关的用户库,以处理的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的所有实例(并把它放在在包括顺序的顶部)。
洙....
- 它是一个坏主意,使用Linux / * H包括在用户空间代码?
- 它是一个坏主意,在内核空间代码使用stdint.h?
- 如果回答这两个是肯定的,那么我该如何处理这种情况的含uint32_t的结构是由用户库和驱动器模块都共享的情况呢?
谢谢。
- 它是一个坏主意,使用Linux / * H包括在用户空间代码?
是的,通常。 典型的情况是,你应该使用C库头(在这种情况下, stdint.h
和朋友),以及接口与C库尽管这些用户空间的类型,并让图书馆手柄通过内核内核说话类型。
你在一个典型的情况是不是虽然。 在你的情况,你正在编写的驱动程序库 。 所以,你应该呈现的接口使用用户空间stdint.h
,但使用linux/*.h
时,接口到你的内核驱动程序标题。
因此,答案是否定的,你的情况。
- 它是一个坏主意,在内核空间代码使用stdint.h?
最绝的是。
参见: http://lwn.net/Articles/113349/
在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?