去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。
了解了高低地址和高低字节的定义,再来看字节序。字节序,顾名思义,字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。大部分人在实际的开发中都很少会直接和字节序打交道。但是在嵌入式开发,跨平台开发以及网络程序开发中,字节序是一个经常需要考虑的问题。
字节序分为两类,所谓大端字节序 (BE-Big Endian)和小端字节序 (LE-Little Endian) 。
最符合人的思维的字节序,地址低位存储值的低位,地址高位存储值的高位。怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说,低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值就应该放在内存地址大的地方,也即内存地址高位
最直观的字节序,地址低位存储值的高位,地址高位存储值的低位。为什么说直观,不要考虑对应关系,只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出,两者对照,一个字节一个字节的填充进去。
上面讲的内存分配中的字节序,都是和计算机自身相关,所以又被称为主机字节序,很显然主机字节序包括了大端字节序(BE)和小端字节序(LE)。
细心的同学肯定会问,真实的世界不可能只涉及在一台主机上的处理,数据是需要在网络上传输的,网络传输的时候和主机的CPU,系统就没有什么关系了? 这句话说的很对,在网络传输的时候,使用的是网络字节序,网络字节序只有一种,就是大端字节序(BE)。
TCP/IP协议栈是强制使用大端字节序来传输协议信息。
下面的一段代码可以用来判断主机是大端的还是小端的,判断的思路是确定一个多字节的值(下面使用的是4字节的整数),将其写入内存(即赋值给一个变量),然后用指针取其首地址所对应的字节(即低地址的一个字节),判断该字节存放的是高位还是低位,高位说明是Big endian,低位说明是Little endian。
在x86上运行如下
[root@centos79 home]# cat endian-test.c
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]#
从前文的描述,似乎字节序是由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 条评论