在讨论更高级的话题前,我们需要讨论一下可移植问题。现代版本的Linux内核的可移植性是非常好的,可以运行在许多不同的体系架构上。由于Linux的多平台特性,任何一个重要的驱动程序都应该是可移植的。
与内核代码相关的核心问题是这些代码应该能够同时访问已知长度的数据项,并充分利用不同的处理器的能力。
坚持使用严格的数据类型,并且使用-Wall -Wstrict-prototypes选项编译可以防止大多数的代码缺陷。
内核使用的数据类型主要被分成三大类:类似int这样的标准C语言类型,类似u32这样的有确定大小的类型,以及像pid_t这样的用于特定内核对象的类型。我们将讨论应该在什么情况下使用这三种典型类型,以及如何使用。
使用标准C语言类型
尽管大多数程序员习惯于自由使用像int和long这样的标准类型,但编写驱动程序时应该格外小心,以避免类型冲突和代码缺陷。
问题是,当我们需要“两个字节的填充符”或者“用四个字节字符串表示的某个东西”时,我们不能使用标准类型,因为在不同的体系上,普通C语言的数据类型所占空间的大小并不相同。下面是在不同平台上类型所占空间大小:
尽管在混合使用不同数据类型时我们必须小心谨慎,但有时有理由这样做。这样的一种情况是内存地址,使用无符号整数类型可以更好地实现内存管理;内核把物理内存看作是一个巨型数组,一个内存地址就是该数组的一个索引。此外,我们可以很方便地对指针取值;但在直接处理内存地址时,我们乎从来不会以这种方式对它们取值。使用一个整数类型可以防止这种取值,因而可避免代码缺陷。所以内核中的普通内存地址通常是unsigned long,这利用了如下事实:至少在当前Linux支持的所有平台上,指针和long整型的大小总是相同的。
为数据项分配确定的空间大小
<