Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103653876
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: LINUX

2008-04-29 09:35:39

作者:陈莉君   来自:

字节顺序是指在一个字中各个字节的顺序。处理器在对字取值时既可能将最低有效位所在的字节当作第一个字节(最左边的字节),也可能将其当作最后一个字节(最右边的字节)。如果最高有效位所在的字节放在最高字节位置上,其他字节依次放在低字节位置上,那么该字节顺序称作高位优先(big-endian)。如果最低有效位所在的字节放在最高字节位置上,其他字节依次放在低字节位置上,那么就称作低位优先(little-endian)。
编写内核代码时不应该假设字节顺序是给定的哪一种(当然,如果你编写的是与体系结构相关的那部分代码就另当别论了)。Linux内核支持的机器中使用哪一种字节顺序的都有—甚至包括一些可以在启动的时候选择字节顺序的机器—适用性强的代码应该两种字节顺序都支持。

i386体系结构使用的是低位优先字节顺序。而其他系统大多使用高位优先字节顺序。
让我们看看在实际编程时这些概念有什么意义。让我们考察一下存放在一个四字节的整型中的二进制数,它的十进制对应值是1027:
00000000 00000000 00000100 00000011
在内存中用高位优先和低位优先两种不同字节顺序存放时的比较如表3所示。

表19-3   字节顺序比较

地   址          高位优先          低位优先
0              00000000          00000011
1              00000000          00000100
2              00000100          00000000
3              00000011          00000000
注意使用高位优先的体系结构把最高字节位存放在最小的内存地址上的。这和低位优先形成了鲜明的对照。
最后一个例子,我们提供了如何判断给定的机器使用是高位优先还是低位优先字节顺序的代码:
int x = 1;

if (*(char *) &x ==1)
    /* 低位优先 */
else
    /* 高位优先 */
这段代码在用户空间和内核空间都能用。
1   高位优先和低位优先的历史
高位优先和低位优先源于乔纳森,斯威夫特写于1726年的讽刺小说《格列佛游记》。在小说中,虚构的小人国里最重要的政治问题就是应该把鸡蛋从大头敲开还是从小头敲开。那些支持从大头敲开的就是高位优先,而那些支持从小头敲开的,就是低位优先。
高位优先与低位优先的熟优熟差就好像小人国中的政治争论一样,与其说是技术问题,到不如说是政治问题啦。
2   内核中的字节顺序
对于Linux支持的每一种体系结构,相应的内核都会根据机器使用的字节顺序在它的中定义__BIG_ENDIAN或__LITTLE_ENDIAN中的一个。
这个头文件还从include/linux/byteorder/中包含了一组宏命令用于完成字节顺序之间的相互转换。最常用的宏命令有:
u32 __cpu_to_be32(u32);/* 把cpu字节顺序转换为高位优先字节顺序 */
u32 __cpu_to_le32(u32);/* 把cpu字节顺序转换为低位优先字节顺序 */
u32 __be32_to_cpu(u32);/* 把高位优先字节顺序转换为cpu字节顺序 */
u32 __le32_to_cpus(u32);   /* 把低位优先字节顺序转换为cpu字节顺序 */
这些转换能够把一种字节顺序变为另一种字节顺序。如果两种字节顺序本来就相同(比如,希望从本地字节顺序转化为高位优先字节顺序,而处理器本身使用的就是高位优先字节顺序),那么宏就什么都不做。否则它们就进行转换。
阅读(188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~