09月 18, 2008
第一個(gè)testkernel在Xen中的載入
The Definitive Guide to Xen中第二章的例子,make成功后運(yùn)行xen create domain_config,報(bào)錯(cuò)
Error: (2, ‘Invalid kernel’, ‘xc_dom_compat_check: guest type xen-3.0-x86_32 not supported by xen kernel, sorry\n’)
google之后發(fā)現(xiàn)是虛擬機(jī)類型設(shè)置的問(wèn)題,運(yùn)行xm info可以看到
xen_caps : xen-3.0-x86_32p
末尾的p表示Xen內(nèi)核開(kāi)啟了PAE模式,所以載入的kernel也必須開(kāi)啟PAE,在bootstrap.x86_32.S中加入PAE=yes選項(xiàng)即可。
09月 25, 2008
DomainU中調(diào)用do_console_io
The Definitive Guide to Xen第二章的Exercise,通過(guò)調(diào)用hypercall page中的console_io項(xiàng)輸出Hello World。
但是默認(rèn)選項(xiàng)編譯和啟動(dòng)的Xen是不會(huì)保留DomainU中輸出的信息。參考drivers/char/console.c,可以看到主要有兩個(gè)選項(xiàng)控制了DomainU的do_console_io輸出:
VERBOSE選項(xiàng)可以在編譯Xen的時(shí)候開(kāi)啟debug選項(xiàng),而opt_console_to_ring則是一個(gè)啟動(dòng)選項(xiàng),在grub的啟動(dòng)選項(xiàng)中增加loglvl=all guest_loglvl=all console_to_ring即可。
重啟Xen后就能通過(guò)xm dmesg看到Hello World了。
09月 25, 2008
Xen: Remove support for non-PAE 32-bit
看來(lái)我還是用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 Virtualization
http://www.intel.com/technology/itj/2006/v10i3/3-xen/4-extending-with-intel-vt.htm

上圖為full virtulization的情況,即不修改Guest OS的行為時(shí)的解決方案。Xen為每個(gè)Guest OS維護(hù)了一張shadow page table,其中映射的地址為machine address。一種比較高效的方案是設(shè)置Guest OS的page table為只讀,當(dāng)Guest OS試圖修改這個(gè)虛擬頁(yè)表時(shí),發(fā)生page fault被Xen截獲,Xen修改shadow page table中相應(yīng)的數(shù)據(jù)(把pseudo-physical address轉(zhuǎn)化成machine address)。另外一個(gè)優(yōu)化是guest page table被修改時(shí)不修改shadow page table,只是把它放到一個(gè)待更新列表中,等Guest OS執(zhí)行了刷新tlb的指令后再一次性更新。
The Definitive Guide to Xen上還提到了另一種基于full paravirtulization和shadow page table之間的方案。Xen把Guest OS的page table置為只讀,當(dāng)Guest OS試圖修改page table時(shí),Xen捕獲到page fault,把page directory中對(duì)應(yīng)的入口置為無(wú)效,再把page table改成可寫(xiě)讓Guest OS修改。由于page directory中對(duì)應(yīng)的入口被設(shè)成無(wú)效了,下次訪問(wèn)該地址時(shí)還是會(huì)發(fā)生page fault,這時(shí)候Xen再修改page directory和page table的對(duì)應(yīng)項(xiàng)就行了。
這種方法意味著Guest OS中內(nèi)核管理模塊直接和machine address打交道,而其他部分則仍然使用pseudo-physical address。另外這種情況下page directory不能被Guest OS修改。
另外Xen還用到了段機(jī)制,用來(lái)為Xen保留地址空間開(kāi)始的64M內(nèi)存。
第一個(gè)testkernel在Xen中的載入
The Definitive Guide to Xen中第二章的例子,make成功后運(yùn)行xen create domain_config,報(bào)錯(cuò)
Error: (2, ‘Invalid kernel’, ‘xc_dom_compat_check: guest type xen-3.0-x86_32 not supported by xen kernel, sorry\n’)
google之后發(fā)現(xiàn)是虛擬機(jī)類型設(shè)置的問(wèn)題,運(yùn)行xm info可以看到
xen_caps : xen-3.0-x86_32p
末尾的p表示Xen內(nèi)核開(kāi)啟了PAE模式,所以載入的kernel也必須開(kāi)啟PAE,在bootstrap.x86_32.S中加入PAE=yes選項(xiàng)即可。
09月 25, 2008
DomainU中調(diào)用do_console_io
The Definitive Guide to Xen第二章的Exercise,通過(guò)調(diào)用hypercall page中的console_io項(xiàng)輸出Hello World。
void?start_kernel(start_info_t?*?start_info)
{
????HYPERVISOR_console_io(CONSOLEIO_write,12,"Hello?World\n");
????while(1);
}
{
????HYPERVISOR_console_io(CONSOLEIO_write,12,"Hello?World\n");
????while(1);
}
但是默認(rèn)選項(xiàng)編譯和啟動(dòng)的Xen是不會(huì)保留DomainU中輸出的信息。參考drivers/char/console.c,可以看到主要有兩個(gè)選項(xiàng)控制了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);
}
????/*?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選項(xiàng)可以在編譯Xen的時(shí)候開(kāi)啟debug選項(xiàng),而opt_console_to_ring則是一個(gè)啟動(dòng)選項(xiàng),在grub的啟動(dòng)選項(xiàng)中增加loglvl=all guest_loglvl=all console_to_ring即可。
重啟Xen后就能通過(guò)xm dmesg看到Hello World了。
09月 25, 2008
Xen: Remove support for non-PAE 32-bit
看來(lái)我還是用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 Virtualization
http://www.intel.com/technology/itj/2006/v10i3/3-xen/4-extending-with-intel-vt.htm

上圖為full virtulization的情況,即不修改Guest OS的行為時(shí)的解決方案。Xen為每個(gè)Guest OS維護(hù)了一張shadow page table,其中映射的地址為machine address。一種比較高效的方案是設(shè)置Guest OS的page table為只讀,當(dāng)Guest OS試圖修改這個(gè)虛擬頁(yè)表時(shí),發(fā)生page fault被Xen截獲,Xen修改shadow page table中相應(yīng)的數(shù)據(jù)(把pseudo-physical address轉(zhuǎn)化成machine address)。另外一個(gè)優(yōu)化是guest page table被修改時(shí)不修改shadow page table,只是把它放到一個(gè)待更新列表中,等Guest OS執(zhí)行了刷新tlb的指令后再一次性更新。
The Definitive Guide to Xen上還提到了另一種基于full paravirtulization和shadow page table之間的方案。Xen把Guest OS的page table置為只讀,當(dāng)Guest OS試圖修改page table時(shí),Xen捕獲到page fault,把page directory中對(duì)應(yīng)的入口置為無(wú)效,再把page table改成可寫(xiě)讓Guest OS修改。由于page directory中對(duì)應(yīng)的入口被設(shè)成無(wú)效了,下次訪問(wèn)該地址時(shí)還是會(huì)發(fā)生page fault,這時(shí)候Xen再修改page directory和page table的對(duì)應(yīng)項(xiàng)就行了。
這種方法意味著Guest OS中內(nèi)核管理模塊直接和machine address打交道,而其他部分則仍然使用pseudo-physical address。另外這種情況下page directory不能被Guest OS修改。
另外Xen還用到了段機(jī)制,用來(lái)為Xen保留地址空間開(kāi)始的64M內(nèi)存。