内核的可移植性策略
中间路线:
差不多所有的接口和核心代码都是独立于硬件体系架构的C语言代码;
在对性能要求很严格的部分,内核的特性会根据不同的硬件体系进行调整;
与体系架构相关的代码都放在arch/xx/目录中,xx是体系架构名,比如x86。
字长
Linux中的字长指机器的位数,比如x86有32位和64位的,所以字长分别是32位和64位(字长这里不是字(word)的长度)。
在asm/types.h中的BITS_PER_LONG表示字长,比如include\asm-generic\bitsperlong.h中:
#ifdef CONFIG_64BIT
#define BITS_PER_LONG 64
#else
#define BITS_PER_LONG 32
#endif /* CONFIG_64BIT */
C语言中long类型的长度被确定是机器的字长,而int类型有时会比字长小。
尽管没有明确规定,但是Linux支持的体系架构中,int是32位,short是16位。
操作系统常用一个简单的助记符来描述此系统中数据类型的大小:
LLP64:long long和指针的长度是64位,long是32位的;
扫描二维码关注公众号,回复:
12027657 查看本文章
LP64:long,long long和指针都是64位的;Linux采用的是这种。
ILP64:int,long,long long和指针的长度是64;
用typedef声明的类型称为不透明类型,比如pid_t,atomic_t等,我们不应该假设它们的长度或做类型转换。
内核定义了长度明确的类型:
页长度
定义在asm/page.h下,x86是4KB。