PC端建议访问 https://www.liuluanyi.cn 或点击底部原文阅读 ---- 安装要求 由于 APIC-EM 会调用部分 PI 的功能,在安装 APIC-EM 之前,必须先安装好 PI mdfid=286208072&i=rm 安装步骤 在APIC-EM安装服务器启动之后,系统会自动进入安装向导,并且提示用户输入相应的配置参数。下面是详细的APIC-EM的安装步骤: 1. 选择Create a new APIC-EM cluster: ? 3. 输入APIC-EM网卡配置参数,安装向导会提示用户为每块网络配置相应的参数,APIC-EM默认的主用网卡是eth0。 输入APIC-EMadmin用户名和密码,这个用户名/密码用于登录APIC-EMWeb接口。 ? 8. 输入NTP Server IP地址。 ? 9. APIC-EM安装成功。
控制器,因此我需要知道I/O APIC控制器的控制寄存器的地址,书上说的方法是查主板芯片手册。 然后,根据ACPI规范,我们可以看到,这个Entry指向了多种数据结构,如APIC、HPET等。 Entry中可能包含的部分数据结构(因物理平台而异) 关于我们目标的APIC的信息,就位于表格中的Signature为APIC的数据结构中。 I/O APIC的控制寄存器的地址。 再继续查找文档,看到Interrupt Controller Structure的部分内容如下: 其中,I/O APIC的数据结构中,就有我们需要的I/O APIC控制寄存器的物理地址。
对于多核处理器所配套的ICH,就需要将集成的PIC升级为APIC了。南桥上集成的APIC被称为IO APIC,而每个处理器核上还有本地的PIC,被称为Local APIC。 Local APIC可以接收来自IO APIC的中断,并使得所在的CPU进入中断处理程序。 如图,IO APIC和Local APIC在程序看来,是合为一体的,当外设的中断发生时,I/O APIC会将中断送到目标的CPU上,目标CPU上的Local APIC触发真正的中断。 最初的KVM在内核中通过软件模拟的方式为每个虚拟机模拟了这个虚拟的APIC,接管虚拟机操作系统对虚拟APIC的配置,并通过软件查表的方式将真实硬件的中断重定向到虚拟机的CPU上。 因此,Intel引入虚拟的APIC,首先为所有的VM中每个CPU的vAPIC实现了一套虚拟的寄存器,它叫做virtual APIC Page, GuestOS对vAPIC进行操作的时候,不会导致VM Exit
timer 1: 2 0 IO-APIC-edge i8042 8: 0 0 IO-APIC-edge rtc 9: 0 0 IO-APIC-level acpi 12: 4 0 IO-APIC-edge i8042 14: 8248017 0 IO-APIC-edge ide0 50: 194 0 IO-APIC-level ohci_hcd timer 1: 2 0 IO-APIC-edge i8042 8: 0 0 IO-APIC-edge rtc 9: 0 0 IO-APIC-level acpi 12: 4 0 IO-APIC-edge i8042
x86-APIC 从逻辑视图上看,APIC 的核外部分是 I/O APIC,核内部分是 Local APIC。 I/O APIC 根据内部 PRT table 中的 RTE 发送中断消息给 Local APIC。 I/O APIC 可以有多个,当多个 I/O APIC 存在时,使用 GSI 代表每个 I/O APIC 管脚的编号:例如 I/O APIC1 有 24 个 IRQ,I/O APIC2 也有 24 个 一个外部中断经过 I/O APIC 再到 Local APIC,最后由 Local APIC 控制中断线在 CPU 上触发中断;CPU 内部的中断源由 Local APIC 管理,不需要经过 I/O APIC ;IPI 也由 Local APIC 管理,同样不需要经过 I/O APIC。
有全局hpet和局部local apic timer,cpu会用哪个呢? kvm_set_lapic_tscdeadline_msr -->start_apic_timer -->restart_apic_timer { ,但如果设置了hrtimer,hrtimer的超时函数apic_timer_fn也调用apic_timer_expired,参数from_timer_fn表示是否来自超时函数,超时函数在另一个cpu执行 static void apic_timer_expired(struct kvm_lapic *apic, bool from_timer_fn) { if (! (apic->vcpu)) { kvm_apic_inject_pending_timer_irqs(apic); return; } } https://github.com/torvalds
注意,APIC上的策略都将生效于ACI网络的边缘,因此APIC只会向ACI Leaf/vLeaf推送策略,而并不会向ACI Spine推送策略。 (二)APIC设计 为实现“以应用为中心”,最为关键的技术就是对应用策略的自动管理和部署。APIC使用了“承诺理论”来管理、部署这些应用策略。 APIC的高可用建立在APIC Cluster的基础上。APIC间的自动发现依赖于Boot Director组件完成,APIC节点间通过Appliance Director组件维护集群的状态。 不过实际上,由于APIC只做策略不做转发控制,因此即使所有的APIC节点全部挂掉,整个ACI网络的L2/L3转发是不会受到任何影响的。 由于APIC Cluster间的通信以及APIC与ACI转发设备的通信都是通过IP完成的,而ACI网络中的IP连接是不受APIC控制的,因此APIC可采用In-Band的部署在ACI网络中,而且APIC
x86架构中,每个处理器包含自己的APIC,每个APIC具有32位的寄存器,内部时钟,内部定时器以及2个额外的IRQ线,LINT0和LINT1,用作APIC的中断。 所有私有的APIC都连接到I/O-APIC,组成一个多APIC系统。 图4-1展示了一个多APIC系统的原理图。I/O-APIC通过APIC总线和各个APIC连接在一起。 I/O-APIC相等于一个中继的角色。 图4-1 多APIC系统 I/O-APIC由24条中断线,中断重定向表,可编程寄存器和一个通过APIC总线收发数据的消息单元组成。 当一个CPU想给另一个CPU发送中断时,它就会把目标CPU的私有APIC的标识符和中断号存储到自己APIC的中断命令寄存器(ICR)中。 然后通过APIC总线发送给目标APIC,该APIC就会给自己的CPU发送一个相应的中断。 CPU间的中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。
有全局hpet和局部local apic timer,cpu会用哪个呢? kvm_set_lapic_tscdeadline_msr -->start_apic_timer -->restart_apic_timer { ,但如果设置了hrtimer,hrtimer的超时函数apic_timer_fn也调用apic_timer_expired,参数from_timer_fn表示是否来自超时函数,超时函数在另一个cpu执行 static void apic_timer_expired(struct kvm_lapic *apic, bool from_timer_fn) { if (! (apic->vcpu)) { kvm_apic_inject_pending_timer_irqs(apic); return; } } https://github.com/torvalds
Important: You must enable the I/O APIC in order to use 64-bit mode. 你必须打开IO APIC,如果你运行了64位guestOS,或者,如果你想要高效在MacOSX下开启多核的guestOS支持. 检查下磁盘控制器,建议用IDE加载虚拟磁盘,而不是默认的SATA You must enable the I/O APIC in order to use 64-bit mode. 你必须打开IO APIC,如果你运行了64位guestOS,或者,如果你想要高效在MacOSX下开启多核的guestOS支持. 检查下磁盘控制器,建议用IDE加载虚拟磁盘,而不是默认的SATA
APIC)。 X86对中断的处理 Local APIC的处理过程 每个local APIC对应了一个CPU。 1、 定义各种apic driver 首先,每种apic配置都会使用apic_driver/ apic_drivers来定义,apic_driver的定义如下 ? .apicdrivers”段中是各个不同的apic配置对应的struct apic。 ? struct apic结构在.apicdrivers中的顺序,依次调用其probe接口,第一个调用返回非0的struct apic结构就被初始化到全局变量apic。
继续执行/proc/iomem | grep -i apic apic设备的访问可以使用mmio(memory mapped io)的方式进行。 同时,如果支持x2apic也可以使用msr访问apic。 那么中断设备的关系如下: i8259每个pic可以产生8中irq,所以master产生的irq是从0-7,slave是8-15。 同时,irq 1也会路由到io apic一份,io apic也会向lapic继续delivery。lapic继续向vCPU注入中断。 linux在启动阶段,检查到io apic后,会选择使用io apic。 尽管经过irq routing产生了i8259 master和io apic两个中断,但是Linux选择io apic上的中断。 同理,如果是virtio-blk产生了中断,则路由到msi处理。
中断控制器有PIC/APIC(IOAPIC和LAPCI),CPU通过IO地址空间访问PIC,PIC芯片线的个数有限,导致中断大量共享,后来就有了高级的PIC,也就是APIC,APIC分别为全局一个IOAPIC 每个CPU有一个LAPIC,只是LAPIC的编号不相同,CPU只能读写自己的LAPIC,LAPIC对应的物理地址在寄存器IA32_APIC_BASE MSR中,虽然所有CPU的IA32_APIC_BASE 由于CPU的核心越来越多,APIC的编号位数不够用了,出了升级版的xAPIC和x2APIC,xAPIC用memory mapping方式访问,x2APIC用读写MSR寄存器的方式访问。 intel发明了apic-access page和virtual-apic page,这两个page的物理地址写在VMCS中,我理解一个guest只有一个apic-access page,每个虚拟CPU 有一个virtual-apic page,guest虚拟CPU读写LAPIC时,EPT把地址翻译指向apic-access page,EPT翻译完了,CPU知道自己此时处于guest模式,正在运行哪个虚拟
还有一些外部设备可以通过I/O APIC进行中断请求[②],这些I/O APIC接收的外部中断需要标明是使用边沿或者电平触发,I/O APIC使用FSB Interrupt Message总线事务将中断请求发向 Local APIC,并由Local APIC向处理器提交中断请求。 此时这个存储器写请求将数据写入I/O APIC的The IRQ Pin Assertion Register中,并由I/O APIC将这个MSI中断请求最终发向Local APIC,之后再由Local APIC通过INTR#信号向CPU提交中断请求。 APIC中断控制器获得中断向量。
X86 SMP系统内核:APIC已自动编译进内核。 X86 UP系统内核:需启用CONFIG_X86_UP_APIC(Processor type and features -> Local APIC support on uniprocessors) 注:CONFIG_X86_UP_APIC用于没有IO-APIC的单处理器机器。 CONFIG_X86_UP_IOAPIC用于具有IO-APIC的单处理器。 对于X86_64, APIC也已自动编译进内核。 --这就是Local-APIC watchdog的缺点。不幸的是:没有"clock ticks"事性可以始终工作。 使用 IO-APIC NMI watchdog 没有这个缺点。
另外一个重要的部分是 I/O APIC,主要是收集来自 I/O 装置的 Interrupt 信号且在当那些装置需要中断时发送信号到本地 APIC,系统中最多可拥有 8 个 I/O APIC。 所有本地 APIC 都连接到 I/O APIC,形成一个多级 APIC 系统,如图下所示。 本地 APIC 被禁止,外部 I/O APIC 连接到 CPU,两条 LINT0 和 LINT1 分别连接到 INTR 和 NMI 引脚。 作为一种标准外部 I/O APIC。 本地 APIC 被激活,且所有的外部中断都通过 I/O APIC 接收。 0 IO-APIC-level acpi 12: 111 IO-APIC-edge i8042 14: 1862 IO-APIC-edge ide0
kvm-demo data]# egrep --color '(vmx|svm)' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic
kvm-demo data]# egrep --color '(vmx|svm)' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid flags : fpu vme de pse tsc msr pae mce cx8 apic
[root@xxxxx ~]# grep aes /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep syscall nx lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic 3dnowprefetch bmi1 avx2 bmi2 rdseed adx xsaveopt flags : fpu vme de pse tsc msr pae mce cx8 apic syscall nx lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic xxx-MB0:~ xxxxxx$ sysctl -n machdep.cpu | grep -i aes FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR
APIC 8259A干的挺不错的,不过后来咱们厂扩大规模,从单核CPU变成了多核,他就有点应付不过来了。 这个APIC的新公司一上台,就成立了两个部门,一个叫I/O APIC,负责接待那些要找我们办事儿的单位,一个叫Local APIC,以外包的形式入驻到我CPU的各个车间工作,因为就挨着我们办公,所以取名叫 I/O APIC收到中断信号以后,根据自己的策略就分发到对应的Local APIC,咱们八个车间就可以专心处理了,为我们省了不少事儿。 不过他告诉我,这也不能怪他,分发给谁处理,那是APIC在负责。 想想也是,回头我就去了APIC那里,要求他们分摊一点给别的车间处理。 APIC表示这他们做不了主,得让厂里来决定。 没过几天,厂里开了个会,参会的有各车间代表、APIC负责人,还请了操作系统那边的相关代表过来。 会上,大家为了此事争执不休。