6.6.3交换空间的数据结构

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