




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一.KVM虛擬機創建的用戶操作對于用戶或者管理員來說,虛擬機的創建有著很多的方法,例如:kvm自帶命令行工具、使用virsh命令來創建、使用具有圖形界面的virt-manager等等。但是它們底層實現的原理都是一樣的,而且它們基本上都是通過開源的虛擬化庫Libvirt來開發的。下面就講一講三種用戶可以創建虛擬機的方式。1.1 利用kvm自帶命令行工具進行創建kvm常用命令如下:參數示例說明-hda-hda /data/windows.img指定windows.img作為硬盤鏡像-cdrom-cdrom /data/windows.iso指定windows.iso作為光盤鏡像-boot-boot
2、 c從硬盤啟動 -boot d從光盤啟動-m-m 512分配512M內存給虛擬系統-vnc-vnc :0作為vnc服務器-cpu-cpu ?列出支持的CPU -cpu core2duo指定CPU為core2duo-smp-smp 2指定虛擬機有2個CPU-net-net nic為虛擬機網卡(默認為tap0) -net tap系統分配tap設備(默認為tap0)1 -net nic -net tap將虛擬機的網卡eth0連接真機里的tap0具體創建一個虛擬機的步驟如下:(1)生成硬盤鏡像文件roothost:kvm-img create -f rawtes
3、t.img 10G其中“-f raw”指定鏡像文件的格式為“raw”,“10G”指定鏡像文件大小。(2)從光盤啟動虛擬機來安裝操作系統roothost:kvm -boot d -hda test.img-cdrom test.iso -m 512其中“-boot d”指定虛擬機從光盤啟動,“-hda test.img”指定硬盤鏡像的位置,“-cdrom test.iso”指定光盤鏡像的位置,“-m 512”指定虛擬機的內存為512M。(3)安裝操作系統后便可直接從硬盤啟動虛擬機roothost:kvm -boot c -hda test.img-m 5121.2 利用virsh命令行工具進行創
4、建1.2.1 virsh工具簡介Virsh是由一個名叫libvirt的軟件提供的管理工具,提供管理虛擬機比較高級的能力。Virsh可以管理KVM以及xen等虛擬機。下面是virsh的一些常見的命令行選項:命令Descriptionhelp打印基本幫助信息。list列出所有客戶端。dumpxml輸出客戶端 XML 配置文件。create從 XML 配置文件生成客戶端并啟動新客戶端。start啟動未激活的客戶端。destroy強制客戶端停止。define為客戶端輸出 XML 配置文件。domid顯示客戶端 ID。domuuid顯示客戶端 UUID。dominfo顯示客戶端信息。domname顯示客
5、戶端名稱。domstate顯示客戶端狀態。quit退出這個互動終端。reboot重新啟動客戶端。restore恢復以前保存在文件中的客戶端。resume恢復暫停的客戶端。save將客戶端當前狀態保存到某個文件中。shutdown關閉某個域。suspend暫停客戶端。undefine刪除與客戶端關聯的所有文件。migrate將客戶端遷移到另一臺主機中。命令Descriptionsetmem為客戶端設定分配的內存。setmaxmem為管理程序設定內存上限。setvcpus修改為客戶端分配的虛擬 CPU 數目。vcpuinfo顯示客戶端的虛擬 CPU 信息。vcpupin控制客戶端的虛擬 CPU 親
6、和性。domblkstat顯示正在運行的客戶端的塊設備統計。domifstat顯示正在運行的客戶端的網絡接口統計。attach-device使用 XML 文件中的設備定義在客戶端中添加設備。attach-disk在客戶端中附加新磁盤設備。attach-interface在客戶端中附加新網絡接口。detach-device從客戶端中分離設備,使用同樣的 XML 描述作為命令attach-device。detach-disk從客戶端中分離磁盤設備。detach-interface從客戶端中分離網絡接口。命令Descriptionversion顯示 virsh 版本nodeinf
7、o有關管理程序的輸出信息1.2.2 virsh命令來創建虛擬機步驟(1)生成硬盤鏡像文件roothost:kvm-img create -f rawtest.img 10G(2)編寫xml配置文件,這一步在1.2.3節具體介紹(3)創建并運行虛擬機roothost:virsh create test.xml其中“test.xml”指定步驟(2)中創建的xml文件 這樣一個虛擬機便創建起來了。1.2.3 xml配置文件的編寫利用virsh工具創建虛擬機必須編寫xml配置文件,該文件指定虛擬機的各項參數,比如虛擬機名稱、磁盤鏡
8、像的位置、內存大小、顯示配置等等。下面給出一個簡單的配置文件的例子。#test.xml <domain type='qemu'> <name>windowsXP</name> <uuid></uuid> <memory>500000</memory> <currentMemory>500000</currentMemory> <vcpu>1</vcpu> <os
9、> <type arch='i686'machine='pc'>hvm</type> <boot dev='hd'/> <boot dev='cdrom'/> </os> <devices> <emulator>/usr/bin/qemu-system
10、-x86_64</emulator> <disk type='file' device='cdrom'> <sourcefile='/home/turnupthesun/kvm/windowsXP.iso'/> <target dev='hdc'/> <readon
11、ly/> </disk> <disk type='file' device='disk'> <sourcefile='/home/turnupthesun/kvm/windowsXP.img'/> <target dev='hda'/> &l
12、t;/disk> <graphicstype='vnc' port='14' listen='127.0.0.1'/> </devices></domain>下面介紹其中幾個比較重要的元素及屬性。(1)<domain>元素的type屬性指定運行域的虛擬機管理器,針對kvm應當選擇“qemu”。(2)<name>元素的內容指定域的名字。(3)<memory>元素和<currentMe
13、mory>元素的內容非別指定啟動時為域分配的最大內存和實際分配的內存。(4)<os></os>元素之間的內容用來指定操作系統啟動的一些信息。其中重復的<boot>元素形成了一個啟動順序表,比如例子中先從磁盤啟動,磁盤無法啟動再從光盤啟動。(5)<disk>元素的device屬性指明不同的設備,<source>標簽的file屬性指明這些設備的位置。1.3 如何通過圖形化界面virt-manager來創建虛擬機 Virt-manger既虛擬機管理器,是創建和管理虛擬客戶端的圖形工具。具體的操作步驟為:
14、60; 從控制臺窗口啟動這個工具,從root身份輸入virt-manager命令,點擊file菜單 的”新建”選項。 virt-manager顯示兩種虛擬化方法:Qemu/KVM或者Xen,這里選擇Qemu/KVM作為hypervisor。 選擇虛擬機名稱和指定一種安裝方法,通過網絡安裝服務器或者本地CD/DVD驅動包括本地ISO文件,在此我用本地ISO的安裝方法。 輸入本地ISO文件路徑和文件名(假設本地ISO的路徑就在根目錄下,名稱為Mini-BT3.6.1.iso) 設置虛擬機使用的內存容量和處理器數量。 配置虛擬機的存儲方法。對于存儲后
15、端有兩種選擇:物理存儲設備或者使用之前建立的磁盤文件。如果處于簡單測試,創建文件作為存儲后端。當創建虛擬磁盤時,默認為10GB。 網絡配置,在這里選擇NAT方式。這樣一個虛擬機就開始啟動起來了,將會出現啟動界面,最后出現虛擬機中操作系統的界面。 二libvirt函數庫如何實現虛擬機創建2.1 virsh工具”create”命令源碼 在libvirt軟件包安裝完成之后,就可以看到libvirt的源碼,這個源碼實現了很多的開發虛擬化軟件的用戶接口,也就是開發的API。里面也實現了工具virsh,這個工具也實現了很多的功能。在/tools下面有一個vir
16、sh.c,這個文件里面實現virsh的功能,這里就具體把創建這部分代碼選取出來。 /* * "create" command */static const vshCmdInfo info_create = "help", N_("create a domain from an XML file"), "desc", N_("Create a domain.&qu
17、ot;), NULL, NULL;static const vshCmdOptDef opts_create= "file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("file containingan XML domain description"),#ifndef WIN32 "console", VSH_OT_BOOL, 0, N_("attach to console after creat
18、ion"),#endif "paused", VSH_OT_BOOL, 0, N_("leave the guest pausedafter creation"), "autodestroy", VSH_OT_BOOL, 0, N_("automatically destroythe guest when virsh disconnects"), NULL, 0, 0, NULL;static boolcmdCrea
19、te(vshControl *ctl, const vshCmd*cmd) virDomainPtr dom; const char *from = NULL; bool ret = true; char *buffer;#ifndef WIN32 int console = vshCommandOptBool(cmd, "console");#endif unsigned
20、 int flags = VIR_DOMAIN_NONE; if (!vshConnectionUsability(ctl, ctl->conn) return false; if (vshCommandOptString(cmd, "file", &from) <= 0) return false; &
21、#160;if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) return false; if (vshCommandOptBool(cmd, "paused") flags |= VIR_DOMAIN_START_PAUSED; if (vshCommandOptB
22、ool(cmd, "autodestroy") flags |= VIR_DOMAIN_START_AUTODESTROY; dom = virDomainCreateXML(ctl->conn, buffer, flags); VIR_FREE(buffer); if (dom != NULL)
23、60;vshPrint(ctl, _("Domain %s created from %sn"), virDomainGetName(dom), from);#ifndef WIN32 if (console)
24、 cmdRunConsole(ctl, dom,NULL);#endif virDomainFree(dom); else vshError(ctl, _("Failed to create domain from %s"), from); ret = fals
25、e; return ret;代碼的講解: typedef struct const char *name; const char *data; vshCmdInfo; 上面這個結構體是關于命令的鍵值對信息,命令一般包含兩個名稱:命令的名字和命令的描述信息。
26、60; typedef struct const char *name; vshCmdOptType type; unsigned int flags; const char *help;
27、 vshCmdOptDef; 上面這個結構體是關于命令選項的定義,該結構體一般包括四個字段:選項的名稱,選項類型,標志,幫助信息。其中選項類型包括:bool類型,字符串類型,整型,字符數據,剩余的參數。 在cmdCreate主程序中有一個特別重要的函數:virDomainCreateXML(),這個函數的最初原型是: virDomainPtr virDomainCreateXML (virConnectPtr conn,const char*xmlDesc,unsigned int flags),這個函數是基于一個
28、指定的XML文件來創建一個虛擬機,其中conn表示一個指向hypervisor的連接,xmlDesc表示一個XML文件,flags表示命令選項的標志。2.2 通過libvirt創建虛擬機的關鍵API通過分析2.1中的virsh源碼我們可以看出,使用libvirt進行虛擬機創建要調用兩個關鍵的API- virFileReadAll和virDomainCreateXML,下面分別進行說明。2.2.1 virFileReadAll 該函數原型為intvirFileReadAll(const char *path, int maxlen, char *buf),功能
29、是將參數“path”指定路徑的文件內容讀到一個緩沖區中,并將緩沖區地址記錄在參數“*buf”中,而參數“maxlen”指定文件的最大長度。利用該API,我們可以將xml配置文件都到一個緩沖區中,以方便接下來的使用。2.2.2virDomainCreateXML該函數原型為virDomainPtr virDomainCreateXML (virConnectPtrconn, const char * xmlDesc, unsigned int flags),功能是根據參數“xm
30、lDesc”定義的配置方式創建一個域并返回該域的指針。參數“conn”是指向虛擬機管理器的指針,而通過設置不同的“flags”標志,可以使創建的域具有不同的屬性。三 利用libvirt庫編寫自己的虛擬機創建程序 Virsh命令用來創建虛擬機的命令是:virsh create,這個命令主要是從給定的XML文件生成客戶端并啟動客戶端。 下面用一個測試例子來說明如何通過virsh命令來創建虛擬機的。 具體的操作實踐步驟是:首先需要創建虛擬硬盤,為了放置操作系統的地方,命令是:kvm-img create 701.img10G,也就
31、是創建一個大小為10G的虛擬硬盤。 2. 編寫一個xml文件,這個文件里面包含啟動操作系統的一些特征,比如:內存容量,操作系統位置,虛擬硬盤位置等等,其實有很多的字段,可以簡寫一個xml文件,如果有些字段沒有定義,那么系統就會默認,下面給出一個xml文件,命名為701.xml,程序為: <domain type='qemu'> <name>linux10.0421</name>
32、 <uuid></uuid> <memory>512000</memory> <currentMemory>512000</currentMemory> <vcpu>1</vcpu> <os>
33、60; <type arch='i686' machine='pc'>hvm</type> <boot dev='cdrom'/> <boot dev='hd'/> &
34、#160;</os> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file
35、' device='cdrom'> <source file='/usr/src/ubuntu-10.04-desktop-i386.iso'/> <target dev='hdc'/> <
36、readonly/> </disk> <disk type='file' device='disk'> <sourcefile='/var/lib/libvirt/images/701.img'/>
37、160; <target dev='hda'/> </disk> <graphics type='vnc' port='5901'listen='127.0.0.1'/> </devices>
38、 </domain> 3. 接著編寫一個c文件,名稱為701.c這個文件主要實現的功能就是調用這個xml文件來創建并啟動虛擬機。這個c程序代碼為: #include<stdio.h> #include<stdlib.h> #include<memory.h>
39、0; #include<libvirt/libvirt.h> const char *from=NULL; static virConnectPtr conn=NULL; #define VIRSH_MAX_XML_FILE 10*1024*1024 void closeConn() &
40、#160; if(conn!=NULL) virConnectClose(conn); int cmdCreate() virDomainPtr dom; char
41、 *buffer; unsigned int flags=VIR_DOMAIN_NONE; conn=virConnectOpen("qemu:/system"); if(conn=NULL)
42、160; fprintf(stderr,"failed to connect tohypervisor/n"); closeConn(); return 0;
43、 if(virFileReadAll(from,VIRSH_MAX_XML_FILE,&buffer)<0) return 0; dom=virDomainCreateXML(conn,buffer,flags); memset(buffer,0,sizeof(buffer);
44、 if(dom!=NULL) fprintf(stdout,"Domain %screated from %sn",virDomainGetName(dom),from); virDomainFree(dom);
45、0; else fprintf(stdout,"Failed to createdomain from %s",from); int main(int a
46、rgc,char *argv) if(argc<2) fprintf(stdout,"there are too fewparameters,should has two more parameters!");
47、 from=*+argv; cmdCreate(); return 0; 4. 在命令窗口中先執行gcc -lvirt -o 701 701.c ,然后執行./701 701.xml,就可以看到這個虛擬機被創建并啟動起來了。 四KVM內核如何實現底層虛擬機創建功能4.1 KVM虛擬機創建和運行虛擬機的流程
48、0; 開源的Lbvirt庫實現了很多的虛擬化API,這些API的實現還是要靠底層的KVM內核的實現,下面重點講講KVM內核中是如何實現虛擬機創建和運行功能的操作系統層的實現。 KVM虛擬機創建和運行虛擬機分為用戶態和核心態兩個部分,用戶態主要提供應用程序接口,為虛擬機創建虛擬機上下文環境,在libkvm中提供訪問內核字符設備/dev/kvm的接口;內核態為添加到內核中的字符設備/dev/kvm,模塊加載進內核后,即可進行接口用戶空間調用創建虛擬機。在創建虛擬機過程中,kvm字符設備主要為客戶機創建kvm數據結構,創建該虛擬機的虛擬機文件描述符及其
49、相應的數據結構以及創建虛擬機處理器及其相應的數據結構。kvm創建虛擬機的流程如下圖: 根據上圖就可以大致知道虛擬機創建和運行的流程了。首先申明一個kvm_context_t變量用以描述用戶態虛擬機上下文信息,然后調用kvm_init()函數初始化虛擬機上下文信息;函數kvm_create()創建虛擬機實例,該函數通過ioctl系統調用創建虛擬機相關的內核數據結構并且返回文件描述符給用戶態kvm_context_t數據結構;創建完內核虛擬機數據結構后,再創建內核pit以及mmio等外設模擬設備,然后調用kvm_create_vcpu()函數來創建虛擬處理器,k
50、vm_create_vcpu()函數通過系統調用向由vm_fd文件描述符指向的虛擬文件調用創建虛擬處理器,并將虛擬處理器的文件描述符返回給用戶態程序,供以后的調度使用;創建完虛擬處理器后,由用戶態的QEMU程序申請客戶機用戶空間,用以加載和運行客戶機代碼;為了使得客戶虛擬機正確執行,必須要在內核中為客戶機建立正確的內存映射關系,即影子頁表信息。因此,申請客戶機內存地址空間之后,調用函數kvm_create_phys_mem()創建客戶機內存映射關系,該函數主要通過ioctl系統調用向vm_fd指向隊的虛擬文件調用設置內核數據結構中客戶機內存映射關系,主要建立影子頁表信息;當創建好虛擬處理器和影
51、子頁表后,即可讀取客戶機到指定分配的空間中,然后調度虛擬處理器運行。調度虛擬機的函數為kvm_run(),該函數通過ioctl系統調用調用由虛擬處理器文件描述符指向的虛擬文件調度處理函數kvm_run()調度虛擬處理器的執行,該系統調用將虛擬處理器vcpu信息加載到物理處理器中,通過vm_entry執行進入客戶機執行。在客戶機正常運行期間kvm_run()函數不返回,只有發生以下兩種情況時,函數返回:1,發生了I/O事件,如客戶機發出讀寫I/O的指令;2,產生了客戶機和內核KVM都無法處理的異常。I/O事件處理完畢后,通過重新調用KVM_RUN()函數繼續調度客戶機的執行。4.2 KVM虛擬機
52、創建和運行虛擬機的主要函數分析以及流程 1.函數kvm_init():該函數在用戶態創建一個虛擬機上下文,用以在用戶態保存基本的虛擬機信息,這個函數是創建虛擬機的第一個需要調用的函數,函數返回一個kvm_context_t結構體。該函數原型的實現在libkvm.c中,該函數原型是:kvm_context_t kvm_init(struct kvm_callbacks*callbacks,void *opaque);參數:callbacks為結構體kvm_callbacks變量,該結構體包含指向函數的一組指針,用于在客戶機執行過程中因為I/O事件退出到用戶態的
53、時候處理的回調函數。參數opaque一般未使用。 函數執行基本過程:打開字符設備dev/kvm,申請虛擬機上下文變量kvm_context_t空間,初始化上下文的基本信息:設置fd文件描述符指向/dev/kvm,禁止虛擬機文件描述符vm_fd(-1),設置I/O事件回調函數結構體,設置IRQ和PIT的標志位以及內存頁面記錄的標志位。 用戶態數據結構kvm_context_t用以描述虛擬機實例的用戶態上下文信息。在kvm_common.h文件里面有kvm_context的結構體定義。structkvm_context
54、60; / Filedescriptor to /dev/kvm int fd; int vm_fd; int vcpu_fdMAX_VCPUS; struct kvm_run *runMAX_VCPUS; / Callbacks that KVM uses to emulatevarious unvirtualizable functionality st
55、ruct kvm_callbacks *callbacks; void *opaque; / A pointer to the memory used as thephysical memory for the guest void *physical_memory; / is dirty pages logging enabled for allregions or not int dirty_pages_log_
56、all; / memory regions parameters struct kvm_memory_regionmem_regionsKVM_MAX_NUM_MEM_REGIONS; / do not create in-kernel irqchip if set int no_irqchip_creation; / in-kernel irqchip status int ir
57、qchip_in_kernel; 各個數據域的解釋為:int fd :指向內核標準字符設備/dev/kvm的文件描述符。int vm_fd:指向所創建的內核虛擬機數據結構相關文件的文件描述符。intvcpu_fdMAX_VCPUS:指向虛擬機所有的虛擬處理器的文件描述符數組。struct kvm_run*runMAX_VCPUS:指向虛擬機運行環境上下文的指針數組。struct kvm_callbacks*call_backs: 回調函數結構體指針,該結構體用于處理用戶態I/O事件。void *opaque:指針(還未弄清楚)int dirty_page_log_all
58、:設置是否記錄臟頁面的標志。int no_ira_creation: 用于設置是否再kernel里設置irq芯片。int_irqchip_in_kernel:內核中irqchip的狀態structkvm_callbacks:該結構體用于在用戶態中處理I/O事件,在KVM中調用KVM_QEMU實現,主要包含的數據域為:int (*inb)(void *opaque, uint16_t addr,uint8_t *data):用于模擬客戶機執行8位的inb指令。int (*inw)(void *opaque, uint16_t addr,uint16_t *data):用于模擬客戶機執行16位的i
59、nw指令。int (*inl)(void *opaque, uint16_t addr,uint32_t *data):用于模擬客戶機執行32位的inl指令。int (*outb)(void *opaque, uint16_t addr,uint8_t data):用于模擬客戶機執行8位的outb指令。int (*outw)(void *opaque, uint16_t addr,uint16_t data):用于模擬客戶機執行16位的outw指令。int (*outl)(void *opaque, uint16_t addr,uint32_t data):用于模擬客戶機執行32位的outl指
60、令。int (*mmio_read)(void *opaque, uint64_taddr, uint8_t *data,int len):用于模擬客戶機執行mmio讀指令。int (*mmio_write)(void *opaque, uint64_taddr, uint8_t *data,int len):用于模擬客戶機執行mmio寫指令。int (*debug)(void *opaque, void *env,struct kvm_debug_exit_arch *arch_info):用戶客戶機調試的回調函數。int (*halt)(void *opaque, int vcpu):用于
61、客戶機執行halt指令的響應。int (*shutdown)(void *opaque, void *env):用于客戶機執行shutdown指令的響應。int (*io_window)(void *opaque):用于獲得客戶機io_windows。int (*try_push_interrupts)(void *opaque):用于注入中斷的回調函數。void (*push_nmi)(void *opaque):用于注入nmi中斷的函數。void (*post_kvm_run)(void *opaque, void*env);用戶得到kvm運行狀態函數。int (*pre_kvm_run)
62、(void *opaque, void*env);用于獲得kvm之前運行狀態的函數int (*tpr_access)(void *opaque, int vcpu,uint64_t rip, int is_write);獲得tpr訪問處理函數int (*powerpc_dcr_read)(int vcpu, uint32_tdcrn, uint32_t *data);用于powerpc的dcr讀操作nt (*powerpc_dcr_write)(int vcpu, uint32_tdcrn, uint32_t data);用于powerpc的dcr寫操作int (*s390_handle_in
63、tercept)(kvm_context_tcontext, int vcpu,struct kvm_run *run);用于s390的中斷處理。int (*s390_handle_reset)(kvm_context_tcontext, int vcpu,struct kvm_run *run);用于s390的重設處理。 當客戶機執行I/O事件或者停機操作等事件時,KVM會交給用戶態的QEMU模擬外部I/O事件,調用這個結構體指向的相關的函數進行處理。Struct kvm_run: 用于KVM運行時一些的一些狀態信息。主要包含的數據域為:_u8 request_interrupt_
64、window;_u8 padding17;_u32 exit_reason;_u8 ready_for_interrupt_injection;_u8 if_flag;_u8 padding22;/* in (pre_kvm_run), out (post_kvm_run) */_u64 cr8;_u64 apic_base;union /* KVM_EXIT_UNKNOWN */struct _u64 hardware_exit_reason; 記錄退出原因 hw;/* KVM_EXIT_FAIL_ENTRY */ 客戶機執行過程中執行VM_ENTRY失敗。struct
65、0; _u64hardware_entry_failure_reason; fail_entry;/* KVM_EXIT_EXCEPTION */ 客戶機因為異常退出struct _u32exception; _u32error_code; ex;/* KVM_EXIT_IO */ 客戶機因為IO事件退出。struct kvm_io #define KVM
66、_EXIT_IO_IN 0#define KVM_EXIT_IO_OUT 1_u8 direction;_u8 size; /* bytes */_u16 port;_u32 count;_u64 data_offset; /* relative to kvm_runstart */ io;struct struct kvm_debug_exit_arch arch; debug;/* KVM_EXIT_MMIO */ 客戶機因為MMIO退出struct _u64 phys_addr;_u8 data8;_u32 len;_u8 is_write; mmio;/
67、* KVM_EXIT_HYPERCALL */ 客戶機退出的超調用參數。struct _u64 nr;_u64 args6;_u64 ret;_u32 longmode;_u32 pad; hypercall; /*KVM_EXIT_TPR_ACCESS */ 客戶機退出訪問TPR參數struct _u64rip;
68、60; _u32is_write; _u32pad; tpr_access;/* KVM_EXIT_S390_SIEIC */ 和S390相關數據struct _u8 icptcode;_u64 mask; /* psw upper half */_u64 addr; /* psw lower half */_u16 ipa;_u32 ipb; s390_sieic;/* KVM_EXIT_S390_RESET */#define KVM_S390_RESET_POR
69、0; 1#define KVM_S390_RESET_CLEAR 2#define KVM_S390_RESET_SUBSYSTEM 4#define KVM_S390_RESET_CPU_INIT 8#define KVM_S390_RESET_IPL 16_u64 s390_reset_flags;/* KVM_EXIT_DCR */struct _u32dcrn; _u32data; _u8 is_write; dcr;/* Fix the size of th
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 透析相關試題及答案高中
- 2025年金融機構員工保密協議規范
- 2025年福州股權合伙人策劃退出協議書
- 2025年自動化技術應用合作協議
- 2025年校園有線網絡覆蓋委托施工協議
- 2025年臨時用電事故應急預案與處理協議
- 2025年聯合圖書策劃出版協作協議
- 2025年企業保密協議標準化策劃范本
- 2025年室內設計裝修合作協議書
- 高模量玻璃纖維布項目投資風險評估報告
- 工程調價協商函
- 老年腦卒中患者居家護理
- 2025年中國獨角獸企業行業市場調研及未來發展趨勢預測報告
- 手電鉆安全使用
- 老員工帶新員工的培訓制度
- 《煤礦安全生產責任制》培訓課件2025
- 2025年管理類聯考《英語二》真題復盤卷(帶解析)
- 極地科考裝備智能化設計-深度研究
- 中職高教版(2023)語文職業模塊-第七單元語文綜合實踐-走進傳統節日-探尋文化根脈【課件】
- 扶貧工作考勤管理制度
- 110kV鋼管桿技術規范書
評論
0/150
提交評論