本文章将带读者走进Linux内核,亲身感受一下这个优秀的操作系统Linux的具体搭建过程。其实读者可以看到,若将这一高楼大厦分解细分为砖瓦,那么每一部分其实也并不是那么难的。
在Linux内核中,直接使用基本数据类型来构建的关键数据结构微乎其微,一般都是将基本数据类型组合起来,构成构造数据类型(如结构体等),来组成其关键的数据结构。
本文就以Linux中内存管理中的物理页为例进行讲解。
1、内存页管理机制
内存把物理页作为内存管理的基本单位。尽管处理器的最小可寻址单位通常为字,但是,内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常是以页为单位进行处理的。也正因为如此,MMU以页的大小为单位来管理系统中的页表。因此,从虚拟内存的角度来看,页就是最小分配单位。
不同的体系结构,所支持的页大小也不尽相同,读者可以查看/include/asm../page.h中的定义,如下所示:
/*include/asm-i386/page.h*/
/*PAGE_SHIFT决定页大小,页大小为4KB*/
#define PAGE_SHIFT 12
/*include/asm-alpha/page.h*/
/*页大小为8KB*/
#define PAGE_SHIFT 13
/*include/asm-arm/page.h*/
/*页大小为4KB*/
#define PAGE_SHIFT 12
/*include/asm-arm26/page.h,arm2600*/
/*若定义了页大小为16KB*/
#if defined(CONFIG_PAGESIZE_16)
#define PAGE_SHIFT 14 /*16KB*/
/*其他情况页大小为32KB*/
#else /*default*/
#define PAGE_SHIFT 15 /*32KB*/
#endif
/*include/asm-ppc/page.h*/
/*页大小为4KB*/
#define PAGE_SHIFT 12
这里的PAGE_SHIFT是用于决定页大小的,将它的数值进行以2为底取幂运算,所得到的结果就是页得大小,比如2的12次方为4K。可以看到,不同的体系结构的页大小是不同的,有些体系结构甚至可以支持多种不同的页大小,在ARM中,就可以支持3种页大小,其中S3C2410的页大小为4KB。