沈天真
作者沈天真·2021-04-04 16:49
售前支持·IPS

了解字节序----从PPC64LE中的LE谈起

字数 2180阅读 4025评论 0赞 1

去CentOS官网下载安装介质iso时,需要选择自己需要的iso,因为官网上除了x86 CPU的iso以外,还有其他CPU架构的iso,例如 Power,ARM。如下图这样

细心的同学也注意到了,在Power芯片上,有3种可选的iso,其”Arch”的值分别标着”ppc64le”, “ppc64”, “power9”,分别表示什么含义呢? 看完这篇文章,您应该可以明白了。

高低地址和高低字节

高低地址

计算机在内存中分配空间用于存储数据时,会按照一定的地址顺序来分配,以最经典的C语言内存布局来看,如下图这样。

从图中可以看到,栈(Stack) 分配空间时,是从高地址向低地址分配,而其他的都是从低地址向高地址分配。

高低字节

在十进制中我们都说靠左边的是高位,靠右边的是低位,例如1234,按照从左到右,分别是千位,百位,十位,个位。实际在其他进制也是如此。以 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

字节序 ( byte order )

了解了高低地址和高低字节的定义,再来看字节序。字节序,顾名思义,字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。大部分人在实际的开发中都很少会直接和字节序打交道。但是在嵌入式开发,跨平台开发以及网络程序开发中,字节序是一个经常需要考虑的问题。

字节序分为两类,所谓大端字节序 (BE-Big Endian)和小端字节序 (LE-Little Endian) 。

LE -Little Endian

最符合人的思维的字节序,地址低位存储值的低位,地址高位存储值的高位。怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说,低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值就应该放在内存地址大的地方,也即内存地址高位

BE -Big Endian

最直观的字节序,地址低位存储值的高位,地址高位存储值的低位。为什么说直观,不要考虑对应关系,只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去。

主机字节序和网络字节序

上面讲的内存分配中的字节序,都是和计算机自身相关,所以又被称为主机字节序,很显然主机字节序包括了大端字节序(BE)和小端字节序(LE)。

细心的同学肯定会问,真实的世界不可能只涉及在一台主机上的处理,数据是需要在网络上传输的,网络传输的时候和主机的CPU,系统就没有什么关系了? 这句话说的很对,在网络传输的时候,使用的是网络字节序,网络字节序只有一种,就是大端字节序(BE)。

TCP/IP协议栈是强制使用大端字节序来传输协议信息。

判断字节序的程序

下面的一段代码可以用来判断主机是大端的还是小端的,判断的思路是确定一个多字节的值(下面使用的是4字节的整数),将其写入内存(即赋值给一个变量),然后用指针取其首地址所对应的字节(即低地址的一个字节),判断该字节存放的是高位还是低位,高位说明是Big endian,低位说明是Little endian。

在x86上运行如下

[root@centos79 home]# cat endian-test.c

include <stdio.h>

int main ()

{

unsigned int x = 0x12345678;

char c = (char)&x;

if (*c == 0x78) {

printf("Little endian\\n");

} else {

printf("Big endian\\n");

}

return 0;

}

[root@centos79 home]# gcc endian-test.c

[root@centos79 home]# ./a.out

Little endian

[root@centos79 home]#

解释 “Arch”PPC64 / PPC64LE / Power9

从前文的描述,似乎字节序是由CPU决定的,CPU分配内存存放数据的时候,可以决定高低地址和高低字节的对应关系。但是从网络字节序的规定来看,似乎又可以由软件来强制决定字节序。实际的情况是,很多时候字节序是有CPU和软件共同决定。

以Power CPU为例,在Power8 CPU之前,例如 Power7 CPU,都只有大端字节序。Power8 CPU则采用了所谓的 bi-endian 即双端字节序的设计,此时系统的字节序是由操作系统决定的。安装AIX操作系统,系统的字节序是大端的;安装大端的Linux操作系统,系统字节序也是大端的;而安装小端的Linux操作系统,系统字节序就是小端的。

至此,我们可以解释一下文章开头关于CentOS官网上的 “Arch” 值的问题。

PPC64LE ,特指 Power8 CPU,Little Endian 的CentOS。

PPC64,特指Power8 CPU, Big Endian 的CentOS。

Power9 , 实际从 Power9 CPU开始,不再有Big Endian 的 CentOS ,只有 Little Endian 的CentOS,所以就不需要特别标注 “LE”了。

so, do you understand now ?

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广