1) Xen代码中三个比较重要的文件夹 arch common include
2)xen/arch/x86/mm.c
页面引用两种计数
tot_count记录一个物理页帧的所有引用,有引用的页面不会返回给空闲池(引用分为页目录,页表,可写页三种类型);
type_count记录当前类型下的引用数,为0时才可转换类型
3)dom_xen
dom_io
dom_cow
4)最底部的页面分配代码,即buddy和slab系统在xen/common/page_alloc.c
5)MFN(machine frame number)
6)zap
7)round_pageup
round_pagedown
8)PAGE_SHIFT
9)struct page_list_head {
}
一般插入到next处,即前段插入
struct page_list_entry {
}
struct page_info里包括
page_list_entry
还包括v.free.order,记载所在页链表中页数目
10)page_to_mfn(pg)
page_to_madrr(pg)
11)#define likely(x) __builtin_expext(!!(x), 1)
#define
12)Try Your English:
MMU Memory Management Unit
MTRR Memory Type Range Register
CoW Copy in Write
PoD Populated-on-Demand
PAE Physical Address Extention
PDE Page Directory Entry
PTE Page Table Entry
PFN Page Frame Number
MFN Machine Frame Number
GPFN Guest Page Frame Number
GMFN Guest Machine Frame Number
M2P Machine-to-Physical Translation Table
P2M Physical-to-Machine Translation Table
MPT Machine Physical Mapping Table
GDT Global Descriptor Table
LDT Local Descriptor Table
13)内存地址转换
逻辑地址 -> 分段单元 -> 线性地址 -> 分页单元 -> 物理地址
x86_64 CPU一般不采用分段机制,Xen内核区域(168M保留)用页面级保护实现
hvm 影子页表 p2m
pvm p2m_domain结构
气球驱动 memory.c
14)xen/common/page_alloc.c
buddy调用层次:
alloc_domain_struct
alloc_xenheap_pages
alloc_domheap_pages
alloc_heap_pages(最底层)
虚拟机内存大小调节:
1.PoD机制:Populate-on-Demand
hvm启动时,只读e820 maps确定它们的内存
=> 1)以一个新P2M类型记录最大的mem值(maxmem)
2)分配memory_dynamic_max内存(target)给PoD Cache(struct domain中)
3)启动guest
4)填充P2M表on demand, PoD Cache
5)Balloon启动时,大小为maxmem - target,guest os为zero it,emergency sweep寻找0页面,交还给Xen
若Balloon driver不在,无0页面,PoD domain crash
使用前提:1)balloon driver ok
2)xen create testhvm maxmem=512 memory=256
2./xen/common/memory.c
decrease_reservation:判断is_hvm_domain && p2m_pod_decrease_reservation
increase无判断,值写入数据结构中,vm内存不变,重启后变