移植一个项目,从MIPS到X86。
很多细节的地方都及时继续进行修改了。最后在功能验证的时候,总是发现端口不对,但是实际解析的时候有没有什么问题。没办法,只要详细的打印传递给函数的端口值,结果一看,传给接口函数的端口值就不对。通常这种问题我会优先考虑字节序的问题,于是乎就将端口值转换成十六进制,然后高低字节交换之后,再转成十进制一看,正好就是实际的端口值。原来是字节序的问题。
分析了一下移植前的代码,才发现MIPS上的代码在做端口以及IP地址的比较时,都是直接比较,而不做任何的转换。当时看的时候还比较纳闷,现在明白了,MIPS本身是big-endian的,和网络字节序是一样的。因此,在MIPS平台上存储的主机字节序和网络字节序是移植的。因此,如果本地存储了一个端口值,需要和skb中记录的值相比较的时候,直接比较就可以了,不用考虑字节序的转换问题。
不过,这样的做法,很显然不具有较好的一致性,这个在我移植的项目中已经体现出来了。从可移植性上来讲,不应该对主机字节序做任何假设,即使你知道当前的系统是little-endian或者big-endian。一旦存在主机字节序和网络字节序比较的时候,要么将网络字节转换成主机字节序,要么主机字节序转换成网络字节序。实际上,如果主机字节序和网络字节序一致的话,转换函数的内部就不做真正的转换工作了。
这是可移植性中一个小小的方面,平时开发项目过程中,还有很多方面需要注意可移植性。
-------------------Godbach于2009年11月24日
阅读(12831) | 评论(6) | 转发(2) |