当Linux需要将内存的一些页面换出到文件上时(swap),内存与交换设备(比如硬盘)就发生了关联。另一处关联是mmap系统调用将一个文件映射到内存中,这样可以加快文件的访问。对于swap,每一个swap设备或者文件被内核中一个swap_info_struct结构体所描述。 这个结构体定义在include/linux/swap.h头文件中(kernel 2.4)。
在swap_info_struct结构体中有一个unsigned short *类型的成员(swap_map)指向一个数组,且其中每一个短整数都代表一个页面。这个数组的大小是由swap_info_struct的另一个成员pages决定的,这个成员实际上也就指定了swap文件的大小。swap_map[0]说明了该文件的一些性质,例如哪些页面可供使用的位图。一般来说文件的开头与结尾的地方有一些盘上物理页面(现在在盘上的页面)是不能使用的。所以swap_info_struct另外的成员lowest_bit和highest_bit指明可以使用的范围。
Linux允许多个交换文件,且这些文件形成了一个数组:struct swap_info_struct swap_info[MAX_SWAPFILES];其中MAX_SWAPFILES的值为8。除此之外还将这些交换文件组成一个优先级队列:struct swap_list_t swap_list={-1,-1};struct swap_list_t{int head;int next;} 。刚开始的时候 没有交换文件,所以被初始化成-1,-1。这种连接的方式有点像数据结构中的静态链表,假设此时有swap_info_struct连接进来,那么next会指向刚刚进来的那个swap_info_struct。而swap_info_struct的next字段会成为-1。以此类推,当不断的有swap_file连接进来的时候,原来那个next为-1的swap_info_struct的next字段就会指向新进入的swap_info_struct(它们还有一个数组叫swap_info)。
盘上页面也有其表项在页表上,指明这个页面在哪个文件上以及偏移是多少。swap_entry_t实际上是一个包在结构体里的32位数。高27位为偏移(文件里面的哪儿),随后7位指明是哪个设备(文件),最后一位为0(这样硬件就知道这个页面并不在内存中,后面交给操作系统处理)。关于操作这个swap_entry_t的宏也就简单了,无非是左移1位或者8位或者相反。(未完)