QEMU-KVM虚拟化:内存调整控制

以下命令行亲自执行有效,执行环境:

Compiled against library: libvirt 4.5.0
Using library: libvirt 4.5.0
Using API: QEMU 4.5.0
Running hypervisor: QEMU 1.5.3

架构细节可查看:CPU 和内存虚拟化

https://www.cnblogs.com/sammyliu/p/4543597.html

内存虚拟化的映射实现

  • A –> 虚拟地址(VA),指GuestOS提供给其应用程序使用的线性地址空间。
  • B –> 物理地址(PA),经VMM抽象的,虚拟机看到的伪物理地址
  • C –> 机器地址(MA),真是的机器物理地址,即地址总线上出现的地址信号

内存地址的映射关系::
GuestOS:PA = f(VA) #GuestOS维护着一套页表,负责VA到PA的映射
VMM:MA = g(PA) #VMM维护着一套页表,负责PA到MA的映射
通过转换方法实现了从虚拟地址到机器地址的映射。实际运行时,用户程序访问VA1,经过GuestOS的页表转换得到PA1,再由VMM介入并使用VMM的页表将PA1转换为MA1 。

QEMU内存结构

QEMU 利用mmap系统调用,在Host 进程的虚拟地址空间中申请连续大小的空间,作为 Guest 的物理内存

QEMU 作为 Host 上的一个进程运行,Guest 的每个 vCPU 都是 QEMU 进程的一个子线程。而 Guest 实际使用的仍是 Host 上的物理内存,因此对于 Guest 而言,在进行内存寻址时需要完成以下地址转换过程:

  Guest虚拟内存地址(GVA)
          |
    Guest线性地址 
          |
   Guest物理地址(GPA)
          |             Guest
   ------------------
          |             Host
    Host虚拟地址(HVA)
          |
      Host线性地址
          |
    Host物理地址(HPA)

其中,GVA->GPA的映射由 Guest OS 维护,HVA->HPA的映射由 Host OS 维护,因此需要一种机制,来维护GPA->HVA之间的映射关系。

细节原理非常复杂,只需要理解HOST和Guest分别通过页表进行内存地址转换,把物理地址转换为Guest的“虚拟地址“即可。

在此不再深入,可参看

https://www.binss.me/blog/qemu-note-of-memory/

https://www.cnblogs.com/ck1020/p/6729224.html

https://abelsu7.top/2019/07/07/kvm-memory-virtualization/

https://juniorprincewang.github.io/2018/07/20/qemu%E5%86%85%E5%AD%98%E8%99%9A%E6%8B%9F%E5%8C%96/

https://www.anquanke.com/post/id/86412

内存调整控制

查看虚拟机内存

只有1G

也可以通过host查看

virsh qemu-monitor-command  centos7  --hmp  --cmd info balloon

修改增加内存

先关机
virsh shutdown centos7

设置最大内存,2G
virsh setmaxmem centos7 2097152

开机
virsh start centos7

设置内存
virsh setmem centos7 2097152

查看结果

查看域信息

virsh dominfo centos7  

 到此,我们已成功实现guest内存增加。

 

posted @ 2020-07-12 10:33  昕友软件开发  阅读(1196)  评论(0编辑  收藏  举报
欢迎访问我的开源项目:xyIM企业即时通讯