qemu内存模型(2) 实现说明
在分析qemu的內存模型具體代碼前我們先來說明一下
qemu要實現的內存管理是什么?
主要是兩部分功能
1 gva->gpa->hva, gva代表guest的虛擬內存地址, gpa代表guest的物理地址, 而hva代表宿主機的虛擬地址, qemu使用宿主機的虛擬地址模擬guest的物理地址, gva->gpa 的轉換主要模擬mmu實現。 而gpa->hva的轉換是qemu工作的重點
2 內存布局的建模。x86的內存模型比較復雜, 主要包含三種類型的內存, rom內存,ram內存和 io內存。 這三種內存對于cpu來說,看到的內存地址中有兩種,分別是內存地址空間和io地址空間。 對于io地址空間很簡單,就是一個端口,一般都是比較段的內存片段。 內存地址空間呢, 如32位的處理器的尋址能力是4g, 也就是不管物理內存有多少,cpu都能看到這么大的地址空間。對于這4g的內存地址空間,分布也是比較復雜的,這些地址空間上不光有內存條的內存地址,還有各種設備的mmio地址(也就是設備地址映射到內存地址空間),另外還有rom的地址,也是在這4g的內存地址空間上。 這就導致了一個問題,內存的互相遮蓋, 比如一個32位的處理器,它的尋址空間為4g,你有一個2g的內存條, 這2g的內存條占用的物理地址空間為0-2g,但是在這0-2g上由于歷史原因,很多rom的地址空間也在這上面,比如vga的地址空間就在0-1m上面的一段地址。 另外設備的端口地址,也可以通過mmio映射到0-4g的內存空間上, 所以qemu要實現的內存模型必須具備一下這些能力:
- 對于不同類型的內存地址的讀寫有不同的處理方式
比如mmio部分對應于設備的寄存器,讀寫應該回調設備的回調函數
ram對應的地址空間,只需要簡單的寫hva就可以了
rom的對應的地址空間,讀就直接寫hva,而寫應該被禁止(或者設備的回調函數) - 不同的內存設備可以在地址空間上重疊,內存控制器可以決定哪種設備的內存在地址空間上覆蓋另一種設備的內存
- mmu的模擬
- gpa -> hva對應關系,給定gpa如何快速找到相應的hva(注意地址空間重合的部分,可能通過個地址空間對應不同的hva,這要進行區分)
所以qemu的內存模型實現如qemu的memory.txt文檔所說(內存模型文檔)
下面再從數據結構方面來描述一下qemu的內存建模
主要涉及到的數據結構有AddressSpace,MemoryRegion,RAMBlock。
AddressSpace代表地址空間,在x86的模擬器上主要有兩種內存地址空間:
- system_memory代表內存地址空間
- system_io 代表io地址空間
MemoryRegion 表示一段內存,或者一個純容器
當代表內存的時候這段內存一般是同一類型的內存,如mmio類型,rom類型,ram類型(基本上有同一類型的讀寫處理方式)。
另外MemoryRegion是一個輸狀結構,樹根對應一個AddressSpace, 將這棵樹展開就是AddressSpace上的一部分地址空間, 所以展開這棵樹的過程要處理內存重合的邏輯。
更多MemoryRegion的說明參考(內存模型文檔)
RAMBlock: 表示一段擁有hva的地址空間,一個RAMBlock對應一個非純容器的MemoryRegion, 這樣AddressSpace, MemoryRegion, RAMBlock 就建立起了gpa->hva的關系。
其實具體的實現比這還是遠遠復雜的(想象一下分頁機制,給定一個頁面如何快速找到對應的hva, io地址空間的碎片性,以及又要滿足tgc和kvm)
總結
以上是生活随笔為你收集整理的qemu内存模型(2) 实现说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu18.04下nvidia-s
- 下一篇: 2岁宝宝吃饭问题网络调研