xenpaging流程详解

整体流程

1) xenpaging初始化。
2) 交换文件初始化。
3) 信号处理初始化。
4) 创建page_in线程。
5) 将内存页page out到交换文件上。
² 程序中,通过for循环调用evict_victim函数将数量为num_pages的页从虚拟机中page out出来。
² 当找不到num_pages个满足page out条件的页时,尽可能多的将页page out出来,然后,跳出for循环。
6) 进入一个while大循环,完成整个xenpaging开启过程中的页交换动作。
² 在5)之后,虚拟机中一部分页被交换到文件中,内存释放掉了。当虚拟机系统再次用到page out页时,会触发缺页中断。该中断被xen捕获,会进一步触发xenpaging的还页动作。此时,xen会重新分配一页,并从交换文件中读取该页信息进行填充,最终,重新映射回虚拟机内部。
² 当balloon向下调整内存时,其释放的页若为page out的页,则将该页丢掉,在位图里标记为page in。
7) 接收到结束信号,进行page in动作。
² 当xenpaging接收到SIGTERM(kill)或者SIGINT(ctrl+c)信号时,将执行page in的动作,在将所有交换出的内存页交换回虚拟机后,进行结束进程前的清理动作。
8) 清理动作xenpaging_teardown。

 

 

1. xenpaging_init

1) 为xenpaging_t类型的变量paging分配内存。
2) 连接xenstore。
3) 初始化shutdown watch。
² 该shutdown watch是用于监控xenstore的@releaseDomain值,在虚拟机关机时,触发xenpaging的关闭动作。
4) 初始化policy_mru_size。
² policy_mru_size默认为1024 * 16,即对应64M内存。policy_mru_size的作用就是防止最近64M被page in的内存页被选中page out出来。该机制的优点是,防止近期频繁使用到的页被page out出来,进而降低交换频率,提高性能。
5) 连接xen。
6) 设置domain id。
7) 初始化shared page。
8) 初始化ring page。
9) 初始化ring。
10) 初始化xen。
11) 开启事件通道。
12) 绑定事件通道。
13) 获取domaininfo。
14) 为page out的位图分配内存。
² page out的位图是用来记录哪些页被page out出来的数据结构。在选页page out和还页的过程中都起到关键作用。
15) 调节num_pages。
² 当num_pages小于0,或者大于虚拟机最大页数。那么将num_pages置为虚拟机的最大页数。
16) 选页策略初始化。
² 目前的选页策略是从中间开始,用以避免BIOS启动过程中执行paging。

 

3. evict_victim

1) 策略选择牺牲者。
² policy_choose_victim的选页算法是从全局静态变量current_gfn开始,线性递增选页,直到选到的页不在pageout的位图中且不在unconsumed的位图中则跳出while循环,将当前页选作被pageout出来的牺牲者。
² 另外一种情况,转了一圈又回到选页起点,则返回no space错误,说明所有pageout位图都被占满。
2) 内存页paging提名。
² xc_mem_paging_nominate通过xc调用最终调用p2m.c中的p2m_mem_paging_nominate。该函数对策略选出的页进行检查,看是否符合要求。若不符合则重新“策略选择牺牲者”。
A. 检查gfn对应的mfn是否有效。无效则提名失败。
B. 检查该页是否pagable。否则失败。
C. 检查该页是否io内存页。是则失败。
D. 检查p2m_is_paging。是则失败。
E. 检查p2m_is_shared。是则失败。
F. 检查页计数和类型。
² 通过检测后,将p2m类型置为p2m_ram_paging_out。
3) xenpaging驱逐页。

² 通过选页和提名两关的页就“悲剧”地被xenpaging驱逐啦。
² 驱逐过程分为下面几步:
A. 映射页。通过xc_map_foreign_pages将虚拟机中的页映射到程序中。
B. 复制页。通过write_page函数将映射页写入交换文件。
C. 清理页。将页清零并解除映射。
D. 告诉xen来驱逐页。xc_mem_paging_evict通过xc调用p2m_mem_paging_evict来将页彻底释放。并将p2m类型置为p2m_ram_paged。

4. page in

page in按触发条件分为两大类:
1) 由缺页引起的page in。
² 虚拟机缺页会触发vmx.c中的ept_handle_violation。
² ept_handle_violation→hvm_hap_nested_page_fault
→p2m_mem_paging_populate
² 检查ring是否满了。如果满了,则返回。
² 如果p2mt为p2m_ram_paged,将其置为p2m_ram_paging_in_start。
² 暂停vcpu。
² 向xenpaging发送page in的request。
2) xenpaging收到中断信号SIGTERM或者SIGINT,会触发xenpaging将所有页page in,然后退出进程。
² 在中断信号初始化后,create_page_in_thread创建一个page in线程。该线程函数主体为page_in,处于待触发状态。
² xenpaging在收到SIGTERM或者SIGINT后,循环调用page_in_trigger来触发page_in执行xc_map_foreign_pages。
² xc_map_foreign_pages又会进一步触发do_mmu_update。
² do_mmu_update中调用p2m_mem_paging_populate来完成page in动作。(同缺页时pagein)

 

5. 环请求处理

在xenpaging的main函数有个while大循环,当检测到环中有未处理请求,则依次处理。
1) ring里有未处理请求,get_request获得请求。
2) 检查该页未page in,则找出该页在交换文件中位置。
3) 若该页标志位为drop,则policy_notify_paged_in策略通知pagein。
4) 否则,xenpaging_populate_page填充页。
² xc_mem_paging_prep让xen为domain分配一页。
A. 获取空闲页。
B. 置p2mt为p2m_ram_paging_in。
² 映射页。将虚拟机中页映射使用。
² 将交换文件内容读入页。
² 解除映射。
5) 拯救页。
² 将response放入环。
² 通知策略页被pagein。
² 告诉xen页已经准备好被换入。
A. 从环拿出响应。
B. 如果页不为MEM_EVENT_FLAG_DROP_PAGE,则置p2mt为p2m_ram_rw。
C. unpause虚拟机的vcpu。

2013年5月21日上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值