xen架构与源码分析xen架构与源码分析•xen源码概览•xen架构实现与源码分析•Xen启动过程•关注点•下周计划xen架构与源码分析•xen源码概览•xen架构实现与源码分析•Xen启动过程•关注点•下周计划Xen-3.4.0/•buildconfigs/•config/•docs/•extras/•stubdom/•tools/•unmodified_drivers/•xen/•.bk-to-hg•.hg_archival.txt•.hgignore•.hgtags•.hg-to-bk•.rootkeys•Config.mk•Copying•install.sh•Makefile•READMExen源码概览•buildconfigs/•config/–该文件夹下包含在多种操作系统下编译xen的配置参数设置文件。•docs–LaTEK格式的Xen文档以及man文档xen源码概览•extras/--mini-OS,内含可运行在XenDomainU的微操作系统•stubdom/–IOEMUStubDomU,PV-GRUBStubDomU,以及创建新的stubdomainU的示例代码。•tools/–用于支持或增强xen监控器的工具集合xen源码概览•unmodified_drivers/–Linux2.6驱动程序•xen/–Xen监控器内核xen-3.4.0/xen•arch/架构相关,函数实现•common/公用•crypto/加解密•drivers/驱动•include/头文件目录,函数定义•tools/工具•xsm/安全模块•COPYING•Makefile•Rules.mk•make配置规则xen架构与源码分析•xen源码概览•xen架构实现与源码分析–MMU–CPU–IO–VMX•Xen启动过程•关注点xen--XenandtheArtofVirtualizationRevisited,IanPratt,CitrixSystemsIncXen源码分析–虚拟化四个核心技术MMU虚拟化CPU虚拟化事件通道IO虚拟化–硬件支持VMX技术xen架构与源码分析•xen源码概览•xen架构实现与源码分析–MMU•xen内存管理•Guest内存管理–CPU–IO–VMX•Xen启动过程•关注点MMU–/xen/include/asm-x86/config.h–/xen/include/mm.h–/xen/arch/x86/mm.c–/xen/include/asm-x86/p2m.h–/xen/include/public/memory.h–/xen/common/memory.c–/xen/include/public/xen.hXen-guest内存分配/隔离分页机制,分段机制地址转换e.g.xen内存•/xen/include/asm-x86/config.h最高168M给xen专用e.g.Guest内存•/xen/include/asm-x86/p2m.h伪物理内存模型MachinePageNumberPseudo-PhysicalPageNumberxen架构与源码分析•xen源码概览•xen架构实现与源码分析–MMU–CPU–IO–VMX•Xen启动过程•关注点CPU–/xen/arch/x86/irq.c–/xen/include/xen/irq.h–/linux*/include/linux/Interrupt.h–/xen/arch/x86/trap.c–/xen/include/asm-x86/processor.h–/xen/include/asm-x86/desc.h–/xen/include/xen/sched.h–/xen/include/xen/timer.h–/xen/common/timer.c–/xen/arch/x86/time.c–/xen/include/public/xen.h–/linux*/arch/i386/kernel/time-xen.c–/xen/include/public/vcpu.h–/xen/include/asm-x86/domain.h–/xen/include/public/arch-x86/xen.h–/xen/arch/x86/setup.c–/xen/common/domain.c–/xen/common/schedule.c–/xen/include/xen/sched-if.h中断/异常处理时间/计时器VCPU及其调度xen架构与源码分析•xen架构实现与源码分析–MMU–CPU•物理中断•虚拟中断•异常处理–xen异常处理–Guest异常处理–IO–VMXxen架构与源码分析•xen架构实现与源码分析–MMU–CPU•物理中断•虚拟中断•异常处理–xen异常处理–Guest异常处理–IO–VMX物理中断处理•/xen/arch/x86/irq.cXen自行处理两个中断:--串口中断+计时器中断Guest处理中断--利用异步通信机制xen-guest--通知所有注册该中断的GuestOS物理中断向量表•/xen/arch/x86/trap.c定义IDT•/xen/include/asm-x86/processor.h•/xen/include/asm-x86/desc.hIDT初始化•/xen/arch/x86/boot/x86_32.S第一次初始化•/xen/arch/x86/i8259.c第二次初始化xen架构与源码分析•xen架构实现与源码分析–MMU–CPU•物理中断•虚拟中断•异常处理–xen异常处理–Guest异常处理–IO–VMX虚拟中断•/xen/include/public/xen.h–VIRQ定义虚拟中断,8种(3个局部vcpu,5个全局中断)虚拟中断•/linux-*/drivers/xen/core/evtchn.cL101–IRQ-VIRQ映射•/xen/common/event_channel.c–Xen发送中断通知xen架构与源码分析•xen架构实现与源码分析–MMU–CPU•物理中断•虚拟中断•异常处理–xen异常处理–Guest异常处理–IO–VMX异常处理—xen•xen内核异常处理–IDT中0-31的中断向量+hypercall(0x82)•重要源文件–/xen/arch/x86/traps.c–/xen/arch/x86/x86_32/entry.S–/xen/include/asm-x86/processor.h异常处理—Guest•Guest内核异常处理–VIDT,GuestOS自行处理异常–一旦domain不运行,对应VIDT被删除•重要源文件–/xen/include/public/arch-x86/xen.h–/linux-*/arch/i386/kernel/traps-xen.c–/xen/arch/x86/traps.c–/xen/include/asm-x86/domain.h–/xen/arch/x86/x86_32/entry.Sxen异常处理•/xen/arch/x86/traps.c将处理程序插入IDT表项xen异常处理•/xen/arch/x86/traps.cxen异常处理•/xen/arch/x86/traps.c初始化IDT–hypercall–双重错误–NMI延迟xen异常处理•/xen/arch/x86/traps.c初始化IDT–hypercall–双重错误–NMI延迟e.g.INT3•/xen/arch/x86/x86_32/entry.S•TRAP_int3为中断向量–定义在/xen/include/asm-x86/processor.hL87-110•hanlde_exception–定义在/xen/arch/x86/x86_32/entry.S•保存寄存器-调用C语言处理函数-退出处理函数e.g.INT3•/xen/arch/x86/x86_32/entry.Se.g.INT3•/xen/arch/x86/x86_32/entry.S–do_int3由C语言实现/xen/arch/x86/traps.cxen架构与源码分析•xen架构实现与源码分析–MMU–CPU•物理中断•虚拟中断•异常处理–xen异常处理–Guest异常处理–IO–VMXGuest异常处理•初始化VIDT–GuestOS可直接使用xen的IDT表处理异常,也可以使用自己的VIDT自行处理异常•GuestOS启动时会将自己的异常表发送给xen,注册到VCPU相应的数据结构。–重要源码•/xen/include/public/arch-x86/xen.h:structtrap_info•/linux*/arch/i386/kernel/traps.xen.c:trap_init()注册到xen•/xen/arch/x86/traps.c:do_set_trap_table()完成VCPU注册Guest异常处理•处理流程–domain内部异常xen捕获/识别xen在Guest中创建异常栈框交由Guest处理–/xen/arch/x86/traps.c系统调用•快速异常处理程序FastHandler•重要源码–/xen/include/public/arch-x86/xen.h–/linux-*/arch/i386/kernel/traps-xen.c–/xen/arch/x86/traps.c–/xen/include/asm-x86/domain.h–/xen/arch/x86/x86_32/entry.S系统调用•快速异常处理程序FastHandler–/xen/arch/x86/x86_32/traps.c•Voidinit_int80_direct_trap(structvcpu*u)•VCPU中int80_desc成员–当GuestOS中产生系统调用时,将会直接调用该描述符中记录的处理程序,而不需要由xen处理–/xen/include/asm-x86/domain.hxen架构与源码分析•xen源码概览•xen架构实现与源码分析–MMU–CPU–IO–VMX•Xen启动过程•关注点–xen校验domain0–MMU监控:进程页/段的完整性–CPU监控:Hypercall/system_call校验发起对象–IO监控:校验发起对象IO设备虚拟化–/xen/include/public/io/ring.h–/xen/include/public/io/blkif.h–/linux*/drivers/xen/blkfront/blkfront.c–/xen/include/public/io/netif.h–/xen/include/public/io/xs_wire.h–/linux*/drivers/xen/xenbus/xenbus_xs.c–/xen/include/public/io/xenbus.h–/linux*/drivers/xen/xenbus/xenbus_probe.c–/linux*/drivers/xen/blkback/xenbus.cIO环事件通道授权表xenstore和xenbus设备模型•仿真设备模型–Qemu•直接分配设备模型–IOMMU•虚拟设备模型–半虚拟化–修改guestOS,性能最好–前端后端设备驱动分离–页面共享设备模型•仿真设备模型–Qemu•直接分配设备模型–IOMMU虚拟设备模型–半虚拟化–修改guestOS,性能最好–前端后端设备驱动分离–页面共享设备模型•虚拟设备模型–半虚拟化–设备IO环•生产者消费者通讯方式–事件通道•一位表示一个事件,虚拟的“硬件中断”–授权表•Domain之间共享内存,授权表记录权限–xenstore•树状数据库,存放虚拟机的配置数据。–xenbus•数据交换中心,为设备读写的前后端提供安全通道。设备IO环•/xen/include/public/i