GNU EFI开发中UINTN数据类型的定义是什么
UINTN 类型说明 具体定义
UINTN 是UEFI环境下的原生位宽无符号整数类型,位宽始终和目标平台的地址总线宽度保持一致:
- 编译32位UEFI目标程序时,
UINTN等价于32位无符号整数,占4字节 - 编译64位UEFI目标程序时,
UINTN等价于64位无符号整数,占8字节 - 面向128位平台编译时,该类型会自动对应128位无符号整数
它的带符号版本为INTN,位宽规则完全一致。
GNU EFI中该类型通过条件编译定义在基础头文件中,核心逻辑等价于:
#if defined(__x86_64__) || defined(__aarch64__) || defined(__riscv64) typedef UINT64 UINTN; typedef INT64 INTN; #else typedef UINT32 UINTN; typedef INT32 INTN; #endif
IDE无法识别该类型属于正常现象:UINTN不属于C标准定义的原生类型,也不在标准库头文件中,只要没有把GNU EFI的头文件目录加入IDE的代码索引路径,就会提示未定义。
是否为GNU EFI专属
不是。UINTN/INTN是UEFI官方规范明确定义的通用基础类型,所有UEFI开发套件(包括官方EDK2框架、GNU EFI、其他第三方UEFI SDK)都会实现该类型,只是定义位置和条件编译细节略有区别。
你代码中调用的GetMemoryMap是UEFI标准启动服务接口,规范中明确规定MemoryMapSize、MapKey、DescriptorSize三个出参的类型就是UINTN,和使用的开发SDK无关。
使用规则
- 所有和平台位宽绑定的场景:包括内存地址、内存长度、UEFI对象键值/句柄、指针互转整数,必须使用
UINTN/INTN,禁止硬编码使用固定位宽的uint32_t/uint64_t,避免跨架构编译时出现指针截断、参数栈对齐错误等问题。 - 打印
UINTN类型值时不要直接用标准C的%u/%d占位符:32位环境下可以正常输出,64位环境下会出现打印值错误。如果用UEFI自带的Print函数,使用%lu/%ld占位符即可;如果用标准C库函数,先将值强转为uint64_t再用%llu输出。 - 结构体中如果需要存和地址访问、长度计算相关的字段,优先用
UINTN类型,保证结构体内存布局和UEFI规范要求一致,避免调用系统接口时出现参数不匹配。 - 你贴出的
GetMemoryMap调用写法是标准实现:第一次传入0值的mapSize查询所需缓冲区大小,此时返回EFI_BUFFER_TOO_SMALL是预期行为,拿到实际需要的大小后分配对应内存,再二次调用获取完整内存映射即可,这里三个变量用UINTN声明完全符合规范要求。
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

