移植性问题包含的内容很广泛,本节要介绍的是代码在不同体系结构下的移植问题。Linux内核是高度可移植的,若希望在不同平台下开发的应用程序或设备驱动程序也能很好地兼容,这就要求用户在开发的过程中要充分考虑与移植相关的内容。本文将讨论数据类型、数据对齐,以及与字节顺序相关的移植性问题。
1 字长和数据类型
不同的体系结构具有不同的字长,表1列出了一些常见体系结构的字长。
表1 表示例
体 系 结 构 |
字 长 |
alpha |
64 |
ia64 |
64 |
mips64 |
64 |
powerpc64 |
64 |
sparc64 |
64 |
x86_64 |
64 |
um |
32/64 |
s390 |
32/64 |
arm |
32 |
体 系 结 构 |
字 长 |
h8300 |
32 |
i386 |
32 |
m32r |
32 |
m68r |
32 |
mips |
32 |
powerpc |
32 |
v850 |
32 |
因此在不同体系结构下C语言数据类型的大小不是相同的,用户必须安排特定大小的数据项,才能更好地进行移植。
在编写程序代码之前,有必要了解各种常用数据类型的长度,比如说char、short、int和long的长度。
● char类型的长度被定义为8字节。
● short类型的长度被定义为至少2字节。因此在有些计算机上,对于某些编译器,short类型的长度可能就是4个字节,甚至更长。
● int类型是一个整数的“自然”大小,其长度至少为2字节,并且至少要和short类型一样长。在16位计算机上,int类型的长度可能为2字节;在32位计算机上,可能为4字节;当64位计算机流行起来后,int类型的长度可能会达到8字节。例如,早期的Motorala 68000是一种16/32位的混合型计算机,依赖于不同的命令行选项,一个68000编译程序能产生两个字节长或4字节长的int类型。
● long类型至少和int类型一样长(因此,它也至少和short类型一样长)。long类型的长度至少为4字节。32位计算机上的编译程序可能会使short、int和long类型的长度都为4字节。
如果需要一个4字节长的整型变量,不能想当然地以为int或long类型能满足要求,而要用sizeof()来检测int和 long的长度;再根据检测的结果,使用typedef把一种固有的类型定义为用户所需要长度的类型,并在其前后加上相应的#ifdef指令。
#ifdef four_Byte_long
typedef long int4;
#endif
Linux内核,在/usr/src/linux/include/asm/types.h文件中也定义了一些长度确定的数据类型。
typedef unsigne