【问题标题】:why is u8 u16 u32 u64 used instead of unsigned int in kernel programming为什么内核编程中使用 u8 u16 u32 u64 而不是 unsigned int
【发布时间】:2015-09-02 23:28:22
【问题描述】:

我看到内核代码中使用了 u8 u16 u32 u64 数据类型。我想知道为什么需要使用u8u16u32u64 而不是unsigned int

【问题讨论】:

  • 因为这只会映射到您列表的 一个。你不能确定是哪一个。
  • 我经常看到标准的 typedef uint8_tuint16_t 等。
  • 我有 linux/types.h 包含

标签: c linux kernel linux-device-driver


【解决方案1】:

通常在靠近硬件工作或试图控制数据结构的大小/格式时,您需要精确控制整数的大小。

至于u8uint8_t,这仅仅是因为Linux 早于<stdint.h> 在C 中可用,这在技术上是C99 主义,但根据我的经验,大多数现代编译器甚至在它们的ANSI- C / C89 模式。

【讨论】:

  • u8 涉及的打字更少:-)
  • 是的...但是当您需要混合和匹配库并且每个人都试图定义自己的已知 wdith 类型时,它会变得非常烦人。您将在同一个文件中拥有U8u8uint8BYTEUINT8unt8_t。您甚至可能存在最终产生警告的潜在冲突。最常见的是 32 位和 64 位类型,它们可能有多种有效方法在给定平台上对它们进行类型定义。对于新代码,请,请,请坚持使用 stdint.h 类型:)。
  • 我在内核空间中使用u8 u16 etc 和linux/types.hstdint.h 是用户空间吗?
  • 您也可以在内核模式下使用标准名称(uint8_t 等)。这些的类型定义也在linux/types.h 中。
  • @BrianMcFarland 只要 u8 等是您的 自己的 typedef,您可以保证与标准的 typedef 相同,但您会没事的。正如 Gil Hamilton 所说,the kernel does this
【解决方案2】:

将我的 10 美分加到this answer

u64 表示“无符号 64 位”值,因此,根据运行/编译代码的架构,必须以不同方式定义它才能真正达到 64 位长。

例如,在 x86 机器上,unsigned long 的长度为 64 位,因此该机器的 u64 可以定义如下:

typedef unsigned long u64;

这同样适用于u32。在 x86 机器上,unsigned int 的长度为 32 位,因此该机器的 u32 可以定义如下:

typedef unsigned int u32;

您通常会在 types.h 文件中找到这些类型的 typedef 声明,该文件对应于您将源代码编译到的架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2019-02-08
    • 1970-01-01
    • 2022-12-12
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多