注册
登录
首页
网站近况
会员
标签
统计
帮助
LUPA论坛
»
内核问题答疑
» Linux内核可移植性(五)-字节顺序
‹‹ 上一主题
|
下一主题 ››
发新话题
发布投票
发布商品
发布悬赏
发布活动
发布辩论
发布视频
打印
Linux内核可移植性(五)-字节顺序
陈莉君
版主
个人空间
发短消息
加为好友
1
#
发表于 2008-4-22 20:39
只看该作者
Linux内核可移植性(五)-字节顺序
字节顺序是指在一个字中各个字节的顺序。处理器在对字取值时既可能将最低有效位所在的字节当作第一个字节(最左边的字节),也可能将其当作最后一个字节(最右边的字节)。如果最高有效位所在的字节放在最高字节位置上,其他字节依次放在低字节位置上,那么该字节顺序称作高位优先(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支持的每一种体系结构,相应的内核都会根据机器使用的字节顺序在它的<asm/byteorder.h>中定义__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字节顺序 */
这些转换能够把一种字节顺序变为另一种字节顺序。如果两种字节顺序本来就相同(比如,希望从本地字节顺序转化为高位优先字节顺序,而处理器本身使用的就是高位优先字节顺序),那么宏就什么都不做。否则它们就进行转换。
透析真谛,似拨云穿雾;共享智慧,如春风沐浴
http://www.kerneltravel.net
UID
26540
帖子
162
精华
1
积分
2456
阅读权限
100
在线时间
228 小时
注册时间
2006-11-9
最后登录
2008-9-7
查看详细资料
TOP
someone
关注开源
个人空间
发短消息
加为好友
2
#
发表于 2008-4-25 20:53
只看该作者
难得陈老师写这么好的文章
不知道是否已经汇编成册,
什么时候出版?
象字长数据对齐实际上是需要真正在各个处理器
上移植过才能遇到的实际问题,一般学生活着一般的人都是不会有多个处理器移植经验,很少人
有这样经历的,所以对他们来说,真的是很难得
的经验之谈了.
UID
16650
帖子
49
精华
0
积分
376
阅读权限
20
在线时间
68 小时
注册时间
2006-1-19
最后登录
2008-9-7
查看详细资料
TOP
‹‹ 上一主题
|
下一主题 ››
控制面板首页
编辑个人资料
积分交易
积分记录
公众用户组
勋章
访问推广
基本概况
流量统计
客户软件
发帖量记录
版块排行
主题排行
发帖排行
积分排行
交易排行
在线时间
管理团队
管理统计