Linux Swap机制关键点分析

1. page被swap出去之后,再次缺页是怎么找到找个换出的页面?
正常内存的页面是通过pte映射找到page的,swap出去的page有其特殊的方式:swap的页面page->private字段保存的是:swap_entry_t通过swap_entry_t就能找到该页面的扇区号sector_t,拿到扇区号就可以从块设备中读回page的内容,那么具体怎么从swap_entry_t找到扇区号呢:

由上图可以计算出来offset和type值,offset值得含义是对应swap_map的slot编号,type可以代表是哪个swap分区,那么根据这两个值就可以计算出扇区号:

具体查找扇区号的源码:swapfile.c:swap_page_sector:

sector_t swap_page_sector(struct page *page)                                                                                                   
{
    struct swap_info_struct *sis = page_swap_info(page);
    struct swap_extent *se;
    sector_t sector;
    pgoff_t offset;

    offset = __page_file_index(page);
    se = offset_to_swap_extent(sis, offset);
    //se->start_page是swap_map数组的索引号或者slot编号,单位是block
    sector = se->start_block + (offset - se->start_page);

    //从block转换成扇区号要x8,因为block size = 4K sector size = 512字节
    return sector << (PAGE_SHIFT - 9);
}

问题:page->private字段存储swap_entry_t,这个private的设置是什么时候,最常见的一种情况:add_to_swap_cache:

add_to_swap_cache:
/*
 * add_to_swap_cache resembles add_to_page_cache_locked on swapper_space,
 * but sets SwapCache flag and private instead of mapping and index.
 */
int add_to_swap_cache(struct page *page, swp_entry_t entry,
            gfp_t gfp, void **shadowp)
{
    struct address_space *address_space = swap_address_space(entry);
    pgoff_t idx = swp_offset(entry);
    XA_STATE_ORDER(xas, &address_space->i_pages, idx, compound_order(page));
    unsigned long i, nr = thp_nr_pages(page);
    void *old;

    VM_BUG_ON_PAGE(!PageLocked(page), page);
    VM_BUG_ON_PAGE(PageSwapCache(page), page);
    VM_BUG_ON_PAGE(!PageSwapBacked(page), page);

    page_ref_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值