2014-10-30 157 views
0

我是qemu開發的新手。我想打印內存分配給虛擬機時涉及的相應地址。qemu中的內存地址的打印範圍

例如,當調用以下命令

QEMU系統-I386 ubuntu.img -m 1G

我需要能夠打印所涉及的虛擬地址和物理地址。像上面1G內存涉及:

遊客的虛擬地址= 0x12345678..to 0×87654321 ..

賓客物理地址= 0x23456781..to 0x74536733。(這是被映射,如果託管虛擬內存中的一個我理解是對的)。

注: 以上數字僅供解釋。

當我查看qemu的源代碼時,我發現無論我們在此命令中提到的大小如何,都被分配爲| ram_addr_t |塊。但我無法找到如何繼續找到這個尺寸的偏移量。請儘早在這方面幫助我。

+0

我想你對QEMU的工作原理有誤解。每個QEMU虛擬機都像主機系統上的進程一樣存在,就像任何其他進程(如shell或桌面窗口管理器)一樣。因此,它的虛擬地址範圍是0到2^N-1(其中N是32或64)。將其映射到物理內存與任何其他進程的作用相同,並且不可能是靜態或連續的。此外,這不是一個編程問題... – twalberg 2014-10-30 18:12:46

+0

我知道主機將qemu虛擬機視爲一個進程。問題不在於託管系統。我想加密qemu分配給虛擬機的某些內存部分的內容。 qemu分配的內存來自其維護的池(當然,它被映射到主機上的虛擬內存),但與主機內存管理系統無關。我想知道qemu分配給虛擬機的這個地址範圍,由qemu維護,而不是主機。所以,你需要修改它的qemu源代碼。如果你有任何想法,請讓我知道。 – SRKV 2014-10-30 18:36:48

回答

0

基於上面,我想你想要做的是不是將來賓虛擬地址映射到來賓物理地址(每個帖子),而是來賓物理地址到主機虛擬地址。

來賓物理和來賓虛擬之間的映射(大部分)由來賓操作系統控制。如果你真的想試圖從客體虛擬客體,那將是特定目標。一些qemu目標甚至沒有這樣的映射(平坦的地址空間)。

我會先看memory.cmemory_mapping.c的來源。

下面是從exec.c的摘錄,它將目標(guest)虛擬地址轉換爲目標物理地址,並在那裏操作內存。那是你需要的嗎?

int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr, 
         uint8_t *buf, int len, int is_write) 
{ 
    int l; 
    hwaddr phys_addr; 
    target_ulong page; 

    while (len > 0) { 
     page = addr & TARGET_PAGE_MASK; 
     phys_addr = cpu_get_phys_page_debug(cpu, page); 
     /* if no physical page mapped, return an error */ 
     if (phys_addr == -1) 
      return -1; 
     l = (page + TARGET_PAGE_SIZE) - addr; 
     if (l > len) 
      l = len; 
     phys_addr += (addr & ~TARGET_PAGE_MASK); 
     if (is_write) { 
      cpu_physical_memory_write_rom(cpu->as, phys_addr, buf, l); 
     } else { 
      address_space_rw(cpu->as, phys_addr, buf, l, 0); 
     } 
     len -= l; 
     buf += l; 
     addr += l; 
    } 
    return 0; 

最後,我想你可能會在qemu IRC頻道上獲得比這裏更多的幫助。

+0

是的。我需要從客戶物理映射到虛擬主機。我需要查看的功能是什麼?這是我需要保留指定給目標或客人圖像的總頁面的某些頁面,然後在特定條件下釋放它們.Plz的幫助。 – SRKV 2014-11-26 21:49:02