如果你走入我们的内核之旅网站http://www.kerneltravel.net/ ,静下心阅读并动手实践,或许,流逝的时间,让你手捧沉甸甸的果实。 欢迎在讨论区提问。
如果你希望有即时的讨论,欢迎到西邮Linux兴趣小组:http://groups.google.com/group/xiyouLinux
Linux内核可移植性(五)-字节顺序
2008-04-23 08:46:41
/ 个人分类:释义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字节顺序 */这些转换能够把一种字节顺序变为另一种字节顺序。如果两种字节顺序本来就相同(比如,希望从本地字节顺序转化为高位优先字节顺序,而处理器本身使用的就是高位优先字节顺序),那么宏就什么都不做。否则它们就进行转换。
相关阅读:
- 内核模块编程之进阶(五)-授人以渔 (陈莉君, 2008-2-23)
- 内存空间探测 (陈莉君, 2008-3-22)
- Linux如何处理共享中断 (陈莉君, 2008-3-26)
- Linux内核书籍点评 (陈莉君, 2008-4-10)
- 内核级程序开发的特点 (陈莉君, 2008-4-18)
- Linux内核可移植性(一)-概述 (陈莉君, 2008-4-20)
- Linux内核可移植性(二)-回顾历史 (陈莉君, 2008-4-20)
- Linux内核可移植性(三)-字长和数据类型 (陈莉君, 2008-4-21)
- Linux内核可移植性(三)-字长和数据类型 (陈莉君, 2008-4-21)
- Linux内核可移植性(四)-数据对齐 (陈莉君, 2008-4-21)
论坛模式
推荐
收藏
等级(1)
编辑
管理
查看(386)
评论(1)
TAG:
释义Linux内核
-
someone
发布于2008-04-26 08:53:49
-
难得陈老师写这么好的文章
不知道是否已经汇编成册,
什么时候出版?
象字长数据对齐实际上是需要真正在各个处理器
上移植过才能遇到的实际问题,一般学生活着一般的人都是不会有多个处理器移植经验,很少人
有这样经历的,所以对他们来说,真的是很难得
的经验之谈了.