为何Linux在byteorder.h中定义__LITTLE/BIG_ENDIAN_BITFIELD宏?
核心疑问
Linux为何将位域分配顺序相关宏命名为__LITTLE_ENDIAN_BITFIELD/__BIG_ENDIAN_BITFIELD并置于byteorder.h中,而非使用__LEAST_TO_MOST_BITFIELD/__MOST_TO_LEAST_BITFIELD这类命名并放在bitfield.h类文件中?
Linux相关代码示例
include/uapi/linux/ip.h
struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD) __u8 version:4, ihl:4; #else #error "Please fix <asm/byteorder.h>" #endif __u8 tos; __be16 tot_len; __be16 id; __be16 frag_off; __u8 ttl; __u8 protocol; __sum16 check; __struct_group(/* no tag */, addrs, /* no attrs */, __be32 saddr; __be32 daddr; ); /*The options start here. */ };
include/uapi/linux/byteorder/little_endian.h
#ifndef __LITTLE_ENDIAN #define __LITTLE_ENDIAN 1234 #endif #ifndef __LITTLE_ENDIAN_BITFIELD #define __LITTLE_ENDIAN_BITFIELD #endif
位域分配顺序
“Endian(字节序)”本应与位域分配顺序无关:
- C17标准(N2310草案) 规定,位域在存储单元内的分配顺序(从高位到低位或低位到高位)由实现定义。
- LSB 5.0规范 中,大端架构S390的字节序与位域分配为同级规范,位域要求从左到右(最高位到最低位)分配,与字节序一致。
位传输顺序
“Endian(字节序)”与位传输顺序(先传最高位或最低位)无关,该顺序由总线控制器和NIC处理。
预期
由于二者独立,应使用__LEAST_TO_MOST_BITFIELD/__MOST_TO_LEAST_BITFIELD这类宏,置于bitfield.h类文件中。
其他参考
RFC791 附录B规定,Version = bytes[0] >> 4,IHL = bytes[0] & 0x0f,且字节中最左侧为最高有效位。
内容的提问来源于stack exchange,提问作者YouJiacheng
相关产品推荐
相关产品推荐

