Linux支持多个交换文件或设备,它们将被swapon 和 swapoff 系统调用来打开或关闭。每个交换文件或设备都可用swap_info_struct 结构来描述:
struct swap_info_struct {
unsigned int flags;
kdev_t swap_device;
spinlock_t sdev_lock;
struct dentry * swap_file;
struct vfsmount *swap_vfsmnt;
unsigned short * swap_map;
unsigned int lowest_bit;
unsigned int highest_bit;
unsigned int cluster_next;
unsigned int cluster_nr;
int prio;
/*
swap priority */
int pages;
unsigned long max;
int next;
/* next entry on swap list */
};
extern int nr_swap_pages;
flags域(SWP_USED 或SWP_WRITEOK)用作控制访问交换文件。当swapoff被调用(为了取消一个文件)时,SWP_WRITEOK置成 off,使在文件中无法分配空间。如果swapon加入一个新的交换文件时,SWP_USED 被置位。这里还有一静态变量(nr_swapfiles)来记录当前活动的交换文件数。
域lowest_bit ,highest_bit表明在交换文件中空闲范围的边界,这是为了快速寻址。
当用户程序mkswap初始化交换文件或设备时,在文件的第一个页插槽的前10个字节,有一个包含有位图的标志,在位图里初始化为0,代表坏的页插槽,1代表相关页插槽是空闲的。
当用户程序调用swapon()时,有一页被分配给swap_map。
swap_map为在交换文件中每一个页插槽保留了一个字节,0代表可用页插槽,128代表不可用页插槽。它被用于记下交换文件中每一页插槽上的swap请求。
内存中的一页被换出时,调用get_swap_page()会得到一个一个记录换出位置的索引,然后在页表项中回填(1--31位)此索引。这是为了在发生在缺页异常时进行处理(do_no_page)。索引的高7位给定交换文件,后24位给定设备中的页插槽号。
另外函数swap_duplicate()被copy_page_tables()调用来实现子进程在fork()时继承被换出的页面,这里要增加域swap_map中此页面的count值,任何进程访问此页面时,会换入它的独立的拷贝。
swap_free()减少域swap_map中的count值,如果count减到0时,则这页面又可再次分配(get_swap_page),在把一个换出页面调入(swap_in)内存时或放弃一个页面时(free_one_table) 调用swap_free()。
相关函数在文件filemap.c中