09月 18, 2008
第一個testkernel在Xen中的載入The Definitive Guide to Xen中第二章的例子,make成功后運行xen create domain_config,報錯
Error: (2, ‘Invalid kernel’, ‘xc_dom_compat_check: guest type xen-3.0-x86_32 not supported by xen kernel, sorry\n’)
google之后發現是虛擬機類型設置的問題,運行xm info可以看到
xen_caps : xen-3.0-x86_32p
末尾的p表示Xen內核開啟了PAE模式,所以載入的kernel也必須開啟PAE,在bootstrap.x86_32.S中加入PAE=yes選項即可。
09月 25, 2008
DomainU中調用do_console_ioThe Definitive Guide to Xen第二章的Exercise,通過調用hypercall page中的console_io項輸出Hello World。
void?start_kernel(start_info_t?*?start_info)
{
????HYPERVISOR_console_io(CONSOLEIO_write,12,"Hello?World\n");
????while(1);
}
但是默認選項編譯和啟動的Xen是不會保留DomainU中輸出的信息。參考drivers/char/console.c,可以看到主要有兩個選項控制了DomainU的do_console_io輸出:
#ifndef?VERBOSE
????/*?Only?domain?0?may?access?the?emergency?console.?*/
????if?(?current->domain->domain_id?!=?0?)
????????return?-EPERM;
#endif
if?(?opt_console_to_ring?)
{
????for?(?kptr?=?kbuf;?*kptr?!=?'\0';?kptr++?)
????????putchar_console_ring(*kptr);
????send_guest_global_virq(dom0,?VIRQ_CON_RING);
}
VERBOSE選項可以在編譯Xen的時候開啟debug選項,而opt_console_to_ring則是一個啟動選項,在grub的啟動選項中增加loglvl=all guest_loglvl=all console_to_ring即可。
重啟Xen后就能通過xm dmesg看到Hello World了。
09月 25, 2008
Xen: Remove support for non-PAE 32-bit看來我還是用Xen 3.1吧 = =
Subject: [Xen-devel] [PATCH] xen: remove support for non-PAE 32-bitLink to this message
From: Jeremy Fitzhardinge (jer…@goop.org)
Date: 05/09/2008 04:05:34 AM
List: com.xensource.lists.xen-devel
Non-PAE operation has been deprecated in Xen for a while, and is rarely tested or used. xen-unstable has now officially dropped non-PAE support. Since Xen/pvops’ non-PAE support has also been broken for a while, we may as well completely drop it altogether.
10月 07, 2008
IA-32 Memory Virtualizationhttp://www.intel.com/technology/itj/2006/v10i3/3-xen/4-extending-with-intel-vt.htm
上圖為full virtulization的情況,即不修改Guest OS的行為時的解決方案。Xen為每個Guest OS維護了一張shadow page table,其中映射的地址為machine address。一種比較高效的方案是設置Guest OS的page table為只讀,當Guest OS試圖修改這個虛擬頁表時,發生page fault被Xen截獲,Xen修改shadow page table中相應的數據(把pseudo-physical address轉化成machine address)。另外一個優化是guest page table被修改時不修改shadow page table,只是把它放到一個待更新列表中,等Guest OS執行了刷新tlb的指令后再一次性更新。
The Definitive Guide to Xen上還提到了另一種基于full paravirtulization和shadow page table之間的方案。Xen把Guest OS的page table置為只讀,當Guest OS試圖修改page table時,Xen捕獲到page fault,把page directory中對應的入口置為無效,再把page table改成可寫讓Guest OS修改。由于page directory中對應的入口被設成無效了,下次訪問該地址時還是會發生page fault,這時候Xen再修改page directory和page table的對應項就行了。
這種方法意味著Guest OS中內核管理模塊直接和machine address打交道,而其他部分則仍然使用pseudo-physical address。另外這種情況下page directory不能被Guest OS修改。
另外Xen還用到了段機制,用來為Xen保留地址空間開始的64M內存。