企业做网站的好处是什么,h5 页面模板,本地视频做成链接网址,网站解析什么意思Xen-Trap
xen的虚拟化实现有一个很重要的机制就是tarp#xff0c;中文可以暂且叫做陷入。在ARMv8中#xff0c;trap就是异常等级的一个切换。
当发生trap的时候#xff0c;就会进入设定好的异常向量表中#xff0c;硬件自动判断属于哪种类型的异常。
一、异常处理
ARM…Xen-Trap
xen的虚拟化实现有一个很重要的机制就是tarp中文可以暂且叫做陷入。在ARMv8中trap就是异常等级的一个切换。
当发生trap的时候就会进入设定好的异常向量表中硬件自动判断属于哪种类型的异常。
一、异常处理
ARM v8有4个异常级别每一个异常级别对应一个 VBAR(Vector Base Address Register) 寄存器用来指向异常向量表的基地址每一个异常向量表的大小为128个字节也即可以存放32条指令ARM v8指令集里一条指令的位宽是32bit的而不是64bit同时每一个异常向量表会分为4组每一组包含4 种异常如图所示 这里的图对应上面的hyp_traps_vector
整理了一下xen对于发生的异常最后会调用如下函数进行处理
functionactiondo_trap_hyp_syncbrk指令处理、当前异常等级产生的数据abort用于由数据访问产生的 MMU 故障、由堆栈指针未对齐引起的对齐故障以及同步外部中止包括同步奇偶校验或 ECC 错误、当前异常等级产生的指令abort用于指令访问和同步外部中止生成的 MMU 故障do_trap_hyp_serror在EL2发生了Serror是不安全的直接输出panic信息do_trap_guest_syncWFI/WFE指令、cp15/cp14/cp10协处理访问、SVE相关指令、SMC指令、HVC指令、访问系统寄存器、从低异常等级产生的数据指令abortdo_trap_guest_serror通过置位HCR_EL2的VSEbit 8来产生Virtual SError interrupt由EL1的异常向量表做进一步处理do_trap_irq处理中断
二、trap处理的事情挑重点
1. guest os的同步异常 — do_trap_guest_sync(关注点)
①SMC调用
functionactiondo_trap_smc处理来自EL1的SMC指令由于xen修改了dom的dts所以os的开核方式不是使用smcmonitor_smcvsmccc_handle_callhandle SMC/HVC call according to ARM SMCCChandle_existing_apis — do_vpsci_0_1_callhandle_sssc — do_vpsci_0_2_call
②HVC调用
functionactiondo_trap_hvc_smccc执行vsmccc_handle_callhandle SMC/HVC call according to ARM SMCCCxen修改了dts让每个dom的psci开核方法为hvcmethod “hvc”;handle_existing_apisdo_vpsci_0_1_callhandle_archhandle_hypervisorhandle_ssscdo_vpsci_0_2_callPSCI_0_2_FN64_CPU_ONplatform_smcdo_trap_hypercalldo_memory_opXENMEM_increase_reservation对应balloon的放气增加guest的内存XENMEM_decrease_reservation对应balloon的吹气减少guest的内存XENMEM_populate_physmap给page分配mfnXENMEM_exchange内存交换XENMEM_maximum_ram_page获取最大的页数XENMEM_current_reservation获取当前预留内存总页数XENMEM_maximum_reservation获取预留内存最大总页数XENMEM_maximum_gpfn获取最大guest pfn数XENMEM_add_to_physmap增加页面映射XENMEM_add_to_physmap_batch增加页面映射不支持iommuXENMEM_remove_from_physmap删除页面映射XENMEM_access_op内存访问权限设置获取XENMEM_claim_pages检查页的权限等信息XENMEM_get_vnumainfo获取vNUMA的拓扑信息XENMEM_reserved_device_memory_map获取外设预留的内存情况看代码arm并没有实现相关的函数XENMEM_acquire_resource获取内存资源情况do_domctlXEN_DOMCTL_setvcpucontext设置vcpu的上下文XEN_DOMCTL_pausedomain暂停domain调用domain_pauseXEN_DOMCTL_unpausedomain取消暂停domain调用domain_unpauseXEN_DOMCTL_resumedomain恢复domain也会调用domain_pause和domain_unpause涉及vcpu的操作XEN_DOMCTL_createdomain创建domainXEN_DOMCTL_max_vcpus设置vcpu数量为max_vcpusXEN_DOMCTL_soft_resetdomain软复位XEN_DOMCTL_destroydomain销毁domainXEN_DOMCTL_setnodeaffinity设置与guest具有亲和力的 NUMA 节点XEN_DOMCTL_getnodeaffinity获取与guest具有亲和力的 NUMA 节点XEN_DOMCTL_setvcpuaffinity设置vpu的亲和度XEN_DOMCTL_getvcpuaffinity获取vcpu的亲和度XEN_DOMCTL_scheduler_op调整domain的调度参数XEN_DOMCTL_getdomaininfo获取domain的相关信息XEN_DOMCTL_getvcpucontext获取vcpu的上下文信息XEN_DOMCTL_getvcpuinfo获取vcpu的信息XEN_DOMCTL_max_mem设置max_pages最大内存数XEN_DOMCTL_setdomainhandle设置domain操作句柄XEN_DOMCTL_setdebugging设置debugger_attached标志位判断guest是否被dom0调试中XEN_DOMCTL_irq_permission设置domain对于给定irq的访问权限XEN_DOMCTL_iomem_permission设置domain对应给定io内存的访问权限XEN_DOMCTL_memory_mapping映射memoryXEN_DOMCTL_settimeoffset设置domain的timeoffsetCNTVOFF_EL2XEN_DOMCTL_set_target设置该guest对给定guest的特权XEN_DOMCTL_subscribe设置suspend_evtchnXEN_DOMCTL_set_access_required设置p2m表的访问权限XEN_DOMCTL_set_virq_handler设置虚拟中断的中断服务函数XEN_DOMCTL_setvnumainfo设置vNUMA的拓扑信息XEN_DOMCTL_monitor_op启用/禁用监视各种 VM 事件do_sched_op调度相关的操作yeiled、shutdown等操作这里不一一列举了直接看代码do_console_ioCONSOLEIO_writeguest对于console的写操作CONSOLEIO_readguest对于console的读操作do_xen_version获取xen版本do_xsm_opxen的Xen Security Modules安全模块相关操作是个钩子do_event_channel_opxen事件通道的相关操作do_physdev_op这是是对于一些物理外设的具体操作目前只实现了pci_physdev_oppci_device_add、pci_device_removedo_sysctlXEN_SYSCTL_readconsole读取consoleXEN_SYSCTL_tbuf_optrace buffers上的 sysctl 操作XEN_SYSCTL_sched_id获取当前调度程序的 IDXEN_SYSCTL_getdomaininfolist获取所有domain的信息XEN_SYSCTL_debug_keys设置debug_key模拟在xen按下按键产生对应的调试信息XEN_SYSCTL_getcpuinfo获取cpu信息XEN_SYSCTL_availheap获取可用的heap内存信息XEN_SYSCTL_page_offline_op设置page的状态online或者offlineXEN_SYSCTL_cpupool_op做 cpupool 相关的 sysctl 操作XEN_SYSCTL_scheduler_op调度相关的sysctl操作XEN_SYSCTL_physinfo获取当前的一些物理信息cpu数量、内存node数量、总页数等等XEN_SYSCTL_numainfo获取numa的相关信息XEN_SYSCTL_cputopoinfo获取xen_sysctl_cputopo结构体信息XEN_SYSCTL_coverage_opTODO没看懂XEN_SYSCTL_livepatch_opTODO没看懂XEN_SYSCTL_overlay在给定的设备树目标节点做add或者remove节点操作do_hvm_opHVMOP_set_param设置xen_hvm_param结构体参数HVMOP_get_param获取xen_hvm_param结构体参数do_grant_table_op (Xen通过提供grant_table_op一系列hypercall以供DomU使用来实现内存共享)GNTTABOP_map_grant_ref映射一个grefGNTTABOP_unmap_grant_ref取消gref的映射GNTTABOP_unmap_and_replace撤销对gref的映射并替换为其他的映射GNTTABOP_setup_table建立grant tableGNTTABOP_transfer移交一个页GNTTABOP_copy拷贝一些页/gref对应的页GNTTABOP_query_size查询grant table的当前/最大大小GNTTABOP_set_version设置grant table的版本GNTTABOP_get_status_frames获取用于存储dom授权状态的帧列表GNTTABOP_get_version获取grant table的版本GNTTABOP_swap_grant_ref交换grefGNTTABOP_cache_flush刷cachegref对应的mfndo_multicall调用arch_do_multicall_call来执行多次hypcalldo_platform_op目前只实现了XENPF_settime64设置墙上时钟wall clockdo_vcpu_opVCPUOP_initialise初始化vcpuVCPUOP_up上线vcpuVCPUOP_down下线vpcuVCPUOP_is_up判断vpcu是否上线VCPUOP_get_runstate_info获取vcpu的运行状态信息VCPUOP_set_periodic_timer设置周期定时器VCPUOP_stop_periodic_timer停止周期定时器VCPUOP_set_singleshot_timer设置单次定时器VCPUOP_stop_singleshot_timer停止单次定时器VCPUOP_register_vcpu_info在客户地址空间中为vcpu_info结构注册一个内存位置VCPUOP_register_runstate_memory_area注册一个共享内存区域
③访问系统寄存器
functionactiondo_sysregHSR_SYSREG_ACTLR_EL1EL1阶段访问ACTLR_EL1寄存器HSR_SYSREG_DCISWEL1阶段访问DCISW、DCCSW、DCCISW寄存器三个都是和cache相关的EL1阶段访问SCTLR_EL1、TTBR0_EL1、TTBR1_EL1、TCR_EL1、ESR_EL1、FAR_EL1、AFSR0_EL1、AFSR1_EL1、MAIR_EL1、AMAIR_EL1、CONTEXTIDR_EL1寄存器HSR_SYSREG_MDRAR_EL1EL1阶段访问MDRAR_EL1寄存器Monitor Debug ROM Address RegisterHSR_SYSREG_OSLAR_EL1EL1阶段访问OSLAR_EL1寄存器OS Lock Access RegisterHSR_SYSREG_OSDLR_EL1EL1阶段访问OSDLR_EL1寄存器OS Double Lock RegisterHSR_SYSREG_OSLSR_EL1EL1阶段访问OSLSR_EL1寄存器OS Lock Status RegisterHSR_SYSREG_MDSCR_EL1EL1阶段访问MDSCR_EL1寄存器Monitor Debug System Control RegisterHSR_SYSREG_MDCCSR_EL0EL0阶段访问MDCCSR_EL0寄存器Monitor DCC Status Register下面是关于性能监视器相关的寄存器HSR_SYSREG_PMINTENSET_EL1EL1阶段访问PMINTENSET_EL1寄存器Performance Monitors Interrupt Enable Set registerHSR_SYSREG_PMINTENCLR_EL1EL1阶段访问PMINTENCLR_EL1寄存器Performance Monitors Interrupt Enable Clear registerHSR_SYSREG_PMUSERENR_EL0EL0阶段访问PMUSERENR_EL0寄存器Performance Monitors User Enable RegisterHSR_SYSREG_PMCR_EL0EL0阶段访问PMCR_EL0寄存器Performance Monitors Control RegisterHSR_SYSREG_PMCNTENSET_EL0EL0阶段访问PMCNTENSET_EL0寄存器Performance Monitors Count Enable Set registerHSR_SYSREG_PMCNTENCLR_EL0EL0阶段访问PMCNTENCLR_EL0寄存器Performance Monitors Count Enable Clear registerHSR_SYSREG_PMOVSCLR_EL0EL0阶段访问PMOVSCLR_EL0寄存器Performance Monitors Overflow Flag Status Clear RegisterHSR_SYSREG_PMSWINC_EL0EL0阶段访问PMSWINC_EL0寄存器Performance Monitors Software Increment registerHSR_SYSREG_PMSELR_EL0EL0阶段访问PMSELR_EL0寄存器Performance Monitors Event Counter Selection RegisterHSR_SYSREG_PMCEID0_EL0EL0阶段访问PMCEID0_EL0寄存器Performance Monitors Common Event Identification register 0HSR_SYSREG_PMCEID1_EL0EL0阶段访问PMCEID1_EL0寄存器Performance Monitors Common Event Identification register 1HSR_SYSREG_PMCCNTR_EL0EL0阶段访问PMCCNTR_EL0寄存器Performance Monitors Cycle Count RegisterHSR_SYSREG_PMXEVTYPER_EL0EL0阶段访问PMXEVTYPER_EL0寄存器Performance Monitors Selected Event Type RegisterHSR_SYSREG_PMXEVCNTR_EL0EL0阶段访问PMXEVCNTR_EL0寄存器Performance Monitors Selected Event Count RegisterHSR_SYSREG_PMOVSSET_EL0EL0阶段访问PMOVSSET_EL0寄存器Performance Monitors Overflow Flag Status Set register下面是和定时器相关的寄存器HSR_SYSREG_CNTP_CTL_EL0EL0阶段访问CNTP_CTL_EL0寄存器Counter-timer Physical Timer Control registerHSR_SYSREG_CNTP_TVAL_EL0EL0阶段访问CNTP_TVAL_EL0寄存器Counter-timer Physical Timer TimerValue registerHSR_SYSREG_CNTP_CVAL_EL0EL0阶段访问CNTP_CVAL_EL0寄存器Counter-timer Physical Timer CompareValue register下面是和GIC中断控制器相关的寄存器HSR_SYSREG_ICC_SGI1R_EL1EL1阶段访问ICC_SGI1R_EL1寄存器Interrupt Controller Software Generated Interrupt Group 1 Register Generates Group 1 SGIs for the current Security stateHSR_SYSREG_ICC_ASGI1R_EL1EL1阶段访问ICC_ASGI1R_EL1寄存器Interrupt Controller Alias Software Generated Interrupt Group 1 Generates Group 1 SGIs for the Security state that is not the current Security stateHSR_SYSREG_ICC_SGI0R_EL1EL1阶段访问ICC_SGI0R_EL1寄存器Interrupt Controller Software Generated Interrupt Group 0 Register Generates Secure Group 0 SGIsHSR_SYSREG_ICC_SRE_EL1EL1阶段访问ICC_SRE_EL1寄存器Interrupt Controller System Register Enable register (EL1)下面是guest os用来识别处理器功能的大多数Identification寄存器ID_PFR0_EL1 ~ ID_PFR2_EL1AArch32 Processor Feature Register 0、1、2ID_DFR0_EL1、ID_DFR1_EL1AArch32 Debug Feature Register 0、1ID_AFR0_EL1AArch32 Auxiliary Feature Register 0ID_MMFR0_EL1 ~ ID_MMFR5_EL1AArch32 Memory Model Feature Register 0、1、2、3、4、5ID_ISAR0_EL1 ~ ID_ISAR6_EL1AArch32 Instruction Set Attribute Register 0、1、2、3、4、5、6MVFR0_EL1 ~ MVFR2_EL1 AArch32 Media and VFP Feature Register 0、1、2ID_AA64PFR0_EL1、ID_AA64PFR1_EL1AArch64 Processor Feature Register 0、1ID_AA64DFR0_EL1、ID_AA64DFR1_EL1AArch64 Debug Feature Register 0、1ID_AA64ISAR0_EL1、ID_AA64ISAR1_EL1AArch64 Instruction Set Attribute Register 0、1ID_AA64MMFR0_EL1 ~ ID_AA64MMFR2_EL1AArch64 Memory Model Feature Register 0、1、2ID_AA64AFR0_EL1、ID_AA64AFR1_EL1AArch64 Auxiliary Feature Register 0ID_AA64ZFR0_EL1AArch64 SVE Feature ID register 0EL1访问 group 3 ID registers ④低异常等级产生的数据指令abort
functionactiondo_trap_stage2_abort_guest数据指令abort都是调用这个函数FSC_FLT_PERM0b0011xxL1/L2/L3页表访问权限错误p2m_mem_access_check这里会去配置页表项设置权限位FSC_FLT_TRANS0b0001xxL0/L1/L2/L3页表翻译错误IPA — PA的页表没有正确配置VA — IPA的翻译已经在guest os的EL1处理了check_p2m — p2m_resolve_translation_faul或者try_map_mmiotry_decode_instruction — 指令aborttry_handle_mmioIO trap or Device emulation解决多个guest os访问一个外设的情况
2. hypervisor同步异常 — do_trap_hyp_sync
functionactiondo_trap_hyp_syncHSR_EC_BRK断点指令异常调试用HSR_EC_DATA_ABORT_CURR_EL同异常等级产生的数据abortdump_hyp_walk。xen的页表错误HSR_EC_INSTR_ABORT_CURR_EL同异常等级产生的指令abortdump_hyp_walk