Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289059
  • 博文数量: 67
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 802
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 16:23
文章分类
文章存档

2011年(4)

2010年(18)

2009年(32)

2008年(13)

我的朋友

分类: LINUX

2009-11-24 11:54:59


移植一个项目,从MIPS到X86。

很多细节的地方都及时继续进行修改了。最后在功能验证的时候,总是发现端口不对,但是实际解析的时候有没有什么问题。没办法,只要详细的打印传递给函数的端口值,结果一看,传给接口函数的端口值就不对。通常这种问题我会优先考虑字节序的问题,于是乎就将端口值转换成十六进制,然后高低字节交换之后,再转成十进制一看,正好就是实际的端口值。原来是字节序的问题。

分析了一下移植前的代码,才发现MIPS上的代码在做端口以及IP地址的比较时,都是直接比较,而不做任何的转换。当时看的时候还比较纳闷,现在明白了,MIPS本身是big-endian的,和网络字节序是一样的。因此,在MIPS平台上存储的主机字节序和网络字节序是移植的。因此,如果本地存储了一个端口值,需要和skb中记录的值相比较的时候,直接比较就可以了,不用考虑字节序的转换问题。

不过,这样的做法,很显然不具有较好的一致性,这个在我移植的项目中已经体现出来了。从可移植性上来讲,不应该对主机字节序做任何假设,即使你知道当前的系统是little-endian或者big-endian。一旦存在主机字节序和网络字节序比较的时候,要么将网络字节转换成主机字节序,要么主机字节序转换成网络字节序。实际上,如果主机字节序和网络字节序一致的话,转换函数的内部就不做真正的转换工作了。

这是可移植性中一个小小的方面,平时开发项目过程中,还有很多方面需要注意可移植性。
                                           -------------------Godbach于2009年11月24日
阅读(3514) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~

Godbach2009-11-29 19:06:08

是啊。我移植到X86上之后,就给在需要的地方都加上字节序转换了。

chinaunix网友2009-11-28 20:46:28

顶你这句话: [color=red] 从可移植性上来讲,不应该对主机字节序做任何假设,即使你知道当前的系统是little-endian或者big-endian。 [/color] 经验之谈,受教了 。

Godbach2009-11-27 18:41:44

呵呵,可能单纯的说MIPS有些笼统,应该具体到芯片。至少我移植的代码使用的芯片是MIPS架构,编程的时候都直接按成大端考虑了。

chinaunix网友2009-11-27 18:33:59

也不一定,很多MIPS是大小端可配置的,也没有标准规定MIPSchip必须实现成哪个,而单纯小端的MIPS也是有的,比如龙芯。

chinaunix网友2009-11-27 12:51:47

除了X86,都是big-endian