一.x86_64是怎么嵌入到Dom0的线性空间的
IA32是通过段保护机制做到的:高64M为Ring-0的Xen空间;
1G-64M为Kernel的Ring-1空间;
其他的3G给Application
x86_64没有段保护机制,必须用页保护机制:2^64-2^47 --> 2^64 ==内核空间
0 -->2^47
== 用户空间
中间空的部分可以作为他用 == 被Xen用了
二.Xen采用直接模式 == Guest OS使用自己的页表直接访问HPA
方法: 页表里的内容为HPA;页表项Guest OS只可读;普通的页Guest OS可直接读写。
一旦更新引起Page异常。如果想要更新/操作页表,可以调用相应的Hypercall。
VMM也能保证Guest OS只能访问自己的内存。
Guest OS操作内存的流程:
1.GuestOS访问一个新内存地址(GVA),PageFault ==> 更新GuestOS的页表
2.Guest OS先找到页表的GPA,VMM根据GPA找到该GPA对应的HPA(通过P2M)
==>相当于页表更新,调用页表更新的Hypercall(GPA,HPA)
3.如果子页表不存在,需要挂接该子页
==>相当于页表挂接操作,调用页表操作的Hypercall(线性地址,HPA)
4.访问该PT表,重复以上2-3步,最终得到一个GVA==>HPA的地址
三.可写页表
由于对页表的操作开销比较大(每次都要进行Hypercall调用),在某些情况下可以改进它()。
方法是:先把页表(实际上只要把总表PD表)拿下来,不让别人访问,把它作为GuestOS的普通的可读写页
Guest OS随便更改,很多次更改完成后,最后提交给Hypercall,让VMM一次完全的完成更新操作。
前提:PAE模式。因为PDE只有一个PD页。
四.Balloon驱动(存在的Dom0和DomU中)
为Dom0和DomU申请/释放内存
可以查看自己和全Machine的内存状况
Balloon驱动根据设置在XenStore的中的目标值来自动调整它的内存的大小。
五.共享页是怎么实现的
Start InfoPage(包括里面的内容)是VMM在Domain初始化时拼成的,它的内容包括了Shared InfoPage和XenStore的连接,进入Domain的前几件事就是把本Doamin的Shared InfoPage利用页表更新上真正VMM已经分配了的存在Start Info Page。
HVM的PV驱动(主要是)当然也要用Shared Info Page,它的Shared InfoPage是自己拼成的。
4.就算是Dom0利用VT-x不也很好吗,用了吗?
5.PAE模式是什么,有什么影响
物理地址扩展 (PAE) 允许将最多64GB 的物理内存用作常规的4KB页面,并扩展内核能使用的位数以将物理内存地址从32扩展到36。
Dom0只有在迁移的时候才用到影子页表,其他时候都用直接访问物理内存。
二.Xen采用直接模式 == Guest OS使用自己的页表直接访问HPA
方法: 页表里的内容为HPA;页表项Guest OS只可读;普通的页Guest OS可直接读写。
Guest OS操作内存的流程:
三.可写页表
四.Balloon驱动(存在的Dom0和DomU中)
五.共享页是怎么实现的
4.就算是Dom0利用VT-x不也很好吗,用了吗?
5.PAE模式是什么,有什么影响
Dom0只有在迁移的时候才用到影子页表,其他时候都用直接访问物理内存。