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內存增加。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM