Overview

History

PCI(Peripheral Component Interconnection)标准是由Intel牵头建立的。大约在1990年,一个来自Intel的Architecture Development Lab的团队设计了PCI并制造了第一个样品,到1992年,PCI规范1.0版正式出炉。

它在服务器端迅速取代了IBM的MCA(Micro Channel Architecture)总线以及Compaq领导的EISA(Extended Industry Standard Architecture)总线,随后在个人PC端取代了VESA Local Bus和ISA总线,在1995年Mac电脑也采用了PCI总线。至此,PCI基本一统天下,除了显卡还需AGP接口进行通信。

MCA总线是IBM计划中取代ISA的下一代总线,但最终只在服务器领域有一些应用,并未成功推广。这是因为IBM试图利用专利壁垒,向所有MCA设备生产商收取高额专利费,这导致PC Clone市场的参与者不愿使用MCA总线。

EISA总线是Compaq领导的“九人帮”(九家PC Clone公司)制定的ISA总线的扩展,用于对抗IBM的MCA总线。它与MCA总线最大的不同就在于它能够兼容ISA总线,因此得到了更多应用,到了后期(96年左右)连IBM自己也开始生产EISA总线的机器。不过因为成本原因,EISA总线未在个人PC市场推广开来。

PS: 事实上,甚至连ISA这个名称也是因EISA总线而诞生的,此前ISA总线被称为PC/AT-Bus或I/O Channel。而且,ISA总线在EISA规范发表后,才随着EISA顺便得到了标准化。

阅读全文 »

下文中出现的VMCS[x]并不是指在VMCS中偏移量为x的位置存放的数据。此处应将x理解为VMREADVMWRITE指令的操作数,VMCS[x]就是VMREAD xVMWRITE x会访问到的那个Field。之所以必须如此,是因为VMCS中的Field具体的偏移量是Implementation Defined的,只能通过手册第三卷附录B中提供的编码访问。

VMX扩展中提供的功能,其是否存在不是通过CPUID指令查询,而是通过MSR查询。由于特性位较多,在正文中不一一叙述,需要时查手册第三卷附录A即可。

本章中用于优化APIC虚拟化的技术统称为APICv

Pin-Based VM-Execution Controls位于VMCS[0x4000](32 bit)
Primary Processor-Based VM-Execution Controls位于VMCS[0x4002](32 bit)
Secondary Processor-Based VM-Execution Controls位于VMCS[0x401E](32 bit)
VM-Exit Controls位于VMCS[0x400C](32 bit)

Virtual APIC State

为了让Guest对其(虚拟)APIC的访问不必引起VM Exit,引入了Virtual-APIC Page的概念。它相当于是一个Shadow APIC,Guest对其APIC的部分甚至全部访问都可以被硬件翻译成对Virtual-APIC Page的访问,这样就不必频繁引起VM Exit了。我们可以通过Virtual-APIC Address(VMCS[0x2012]/VMCS[0x2013](64 bit full/high))指定Virtual-APIC Page的物理地址。

阅读全文 »

下文中出现的VMCS[x]并不是指在VMCS中偏移量为x的位置存放的数据。此处应将x理解为VMREADVMWRITE指令的操作数,VMCS[x]就是VMREAD xVMWRITE x会访问到的那个Field。之所以必须如此,是因为VMCS中的Field具体的偏移量是Implementation Defined的,只能通过手册第三卷附录B中提供的编码访问。

VMX扩展中提供的功能,其是否存在不是通过CPUID指令查询,而是通过MSR查询。由于特性位较多,在正文中不一一叙述,需要时查手册第三卷附录A即可。

Secondary Processor-Based VM-Execution Controls位于VMCS[0x401E](32 bit)

Virtual Processor Identifiers (VPIDs)

VMX在PCID之外又引入了VPID,用于区分不同虚拟机的TLB条目。VPID功能需要通过设置Secondary Processor-Based VM-Execution Controls.Enable VPID[bit 5]来开启,开启后VPID由VMCS[0x0000](16 bit)决定。

VPID的取值可总结如下:

阅读全文 »

Overview

Basics

APIC (Advanced Programmable Interrupt Controller)是90年代Intel为了应对将来的多核趋势提出的一整套中断处理方案,用于取代老旧的8259A PIC。这套方案适用于多核(Multi-Processor)机器,每个CPU拥有一个Local APIC,整个机器拥有一个或多个IOAPIC,设备的中断信号先经由IOAPIC汇总,再分发给一个或多个CPU的Local APIC。为了配合APIC,还推出了MPSpec (Multiprocessor Specification),为BIOS向OS提供中断配置信息的方式提供了规范。

自90年代以来,PCI总线发展出了MSI (Message Signalled Interrupt),目前的机器中是以MSI为主要的中断机制,IOAPIC作为辅助,但CPU处仍使用Local APIC接收和处理中断。当时提出的MPSpec经过演化目前已成为了ACPI规范的一部分,BIOS可以通过ACPI表向OS报告中断配置情况(e.g. IOAPIC的引脚连接到哪个设备)。

初代奔腾(Pentium)上初次引入Local APIC时,它是外置的Intel 82489DX芯片。在一些奔腾型号以及P6 family(即从奔腾Pro到奔腾3)上则将其改为了内置,但功能保持不变。自奔腾4及至强(Xeon)开始取消了APIC Bus以及一部分相关设置,于是改称xAPIC,目前Intel CPU的默认模式就是xAPIC。后来又增加了x2APIC模式作为xAPIC的扩展,这个功能需要手动开启,并且必须配合VT-d的中断重映射功能使用。

至强(Xeon)一开始是作为奔腾的子品牌出现,前两代产品为Pentium II Xeon, Pentium III Xeon。到了奔腾4这一代,至强成为独立的品牌,去掉了奔腾前缀,手册中无后缀单独提及的Xeon指的就是这一代的至强。为了区别,后续开发的至强CPU则都带有后缀或前缀,以示区分。

阅读全文 »

其实呢,搭这个网站是因为科学上网的需要,要用一个网站给v2ray打掩护,于是顺手搭了个hexo。本来呢,里面就是用来放点自己的笔记,网站加了个http basic authentication只给自己看的,不过现在程序员好像都流行写博客,我就挑一部分完整的贴出来好了(也就是说以前写的多数都是想到哪写到哪,写一半弃坑的「笔记」)。目前应该暂时只有手册/Spec解读&速查、代码走读分析这类的文章,如果我懒癌不发作的话(这大概不可能),将来也许会有主题更广泛的文章。

阅读全文 »