²`«×±´¯ÁLinux¨t²ÎµêÀÀ¤Æ(ì²z»P¹ê²{)
¤º®e¤j¿û
³o¬O¤@³¡²`«×Á¿¸Ñ¦p¦ó¦bLinux¾Þ§@¨t²ÎÀô¹Ò¤U¥Î³nÅéµêÀÀ¥X¤@¥x¡uª«²z¡v¹q¸£ªºµÛ§@¡C
¨â¦ì§@ªÌ³£¬O¦Ê«×ªº¸ê²`§Þ³N±M®a¡A¤@¦ì¬O¦Ê«×ªº¥D¥ô¬[ºc®v¡A¤@¦ì¬O¦Ê«×´¼¯à¶³ªº°ÆÁ`¸g²z¡A³£¦b¾Þ§@¨t²Î©MµêÀÀ¤Æµ¥»â°ì¦³¦h¦~ªº¹ê½î¸gÅç¡C¥»®Ñ±q¹q¸£Åé¨tµ²ºc¡B¾Þ§@¨t²Î¡BµwÅéµ¥¦hÓºû«×²`«×±´°Q¤F±qCPU¡B¤º¦s¡B¤¤Â_¡B¥~³]¡Bºô¸ô5Ó¨t²ÎªºµêÀÀ¤Æ¡A¤£¶ÈåªR¤F¨ä¤¤ªºÃöÁä§Þ³Nì²z¡A¦Ó¥B²`¤JÄÄz¤F¨ãÅ骺¹ê²{¡C
¥þ®Ñ¦@6³¹¡C
²Ä1³¹CPUµêÀÀ¤Æ
¤¶²Ð¤Fx86¬[ºc¤UªºVMXÂX®i¡A°Q½×¤F¦bVMX¤UµêÀÀCPUªº§¹¾ã¥Í©R©P´Á¡AµÛ«ÄÄz¤FHost©MGuestªº¤Á´«¡B«ü¥Oªº¼ÒÀÀ¥H¤ÎKVM¬O¦p¦óµêÀÀ¦h³B²z¾¹ªº¡C
²Ä2³¹¤º¦sµêÀÀ¤Æ
°Q½×¤F¾Þ§@¨t²Î¦p¦ó¬°µêÀÀ¾÷§e²{ª«²z¤º¦s¡Aµ²¦X¼v¤l¶ªí¥H¤ÎEPT±´°Q¤FKVM¦p¦ó§¹¦¨±qGVA¨ìHPAªº2¼h¦a§}¬M®g¡C
²Ä3³¹¤¤Â_µêÀÀ¤Æ
¥»³¹±q³Ìªì³æ®Ö¨t²Îªº8259A¡A°Q½×¨ì¦h®Ö¨t²ÎªºAPIC¡A¦A¨ì¶¶}I/O APIC¡B±q³]³Æª½±µ¦VLAPICµo°e°ò©ó®ø®§ªºMSIªºµêÀÀ¤Æì²z©M¹ê²{¡CµM«á¡A°Q½×¤FIntel¬°¤F´£°ª®Ä²v¡A¬O¦p¦ó±qµwÅé¼h±¹ïµêÀÀ¤Æ¤¤Â_¶i¦æ¤ä«ùªº¡A¥H¤ÎKVM¬O¦p¦ó¨Ï¥Î¥¦Ìªº¡C
²Ä4¡B5³¹¥~³]µêÀÀ¤Æ
±q§¹¥þµêÀÀ¤Æ¶}©l¡A¨Ì¦¸Á¿¸Ñ¤F¥bµêÀÀ¤Æ¡]Virtio¡^©MIntelªºVT-d¤ä«ù¤UªºµwÅ黲§UµêÀÀ¤Æ¡C³q¹L¹ê²{¤@Ó¼ÒÀÀ¦ê¤f±a»âŪªÌª½Æ[Åé·|¤F³]³ÆµêÀÀ¤Æªº°ò¥»ì²z¡AµM«á²`¤JÄÄz¤FVirtio¼Ð·Ç©M¹ê²{¡A¥H¤Î¤ä«ùSR-IOVªºDMA«¬M®g©M¤¤Â_«¬M®g¡C
²Ä6³¹ºô¸ôµêÀÀ¤Æ
°Q½×¤F¦b³q¥ÎµwÅéºô¸ôªº°ò¦¤W¡A¾Þ§@¨t²Î¦p¦óµêÀÀ¥X±M¥Îªººô¸ô³]³Æ¡A¬°¯²¤á²Õ«ØµêÀÀºô¸ô¡C
§@ªÌ¤¶²Ð
¤ý¬f¥Í//Á¼sx|³d½s:÷á¶ÇÀs
¥Ø¿ý
«e¨¥
²Ä1³¹ CPUµêÀÀ¤Æ
1.1 x86¬[ºcCPUµêÀÀ¤Æ
1.1.1 ³´¤J©M¼ÒÀÀ¼Ò«¬
1.1.2 x86¬[ºcµêÀÀ¤Æªº»Ùê
1.1.3 VMX
1.1.4 VCPU¥Í©R©P´Á
1.2 µêÀÀ¾÷¤Á¤J©M°h¥X
1.2.1 GCC¤ºÁp·J½s
1.2.2 µêÀÀ¾÷¤Á¤J©M°h¥X¤Î¬ÛÃöªº¤W¤U¤å«O¦s
1.3 ³´¤J©M¼ÒÀÀ
1.3.1 ³X°Ý¥~³]
1.3.2 ¯S®í«ü¥O
1.3.3 ³X°Ý¨ã¦³°Æ§@¥Îªº±H¦s¾¹
1.4 ¹ïºÙ¦h³B²z¾¹µêÀÀ¤Æ
1.4.1 MPTable
1.4.2 ³B²z¾¹±Ò°Ê¹Lµ{
1.5 ¤@Ó²³æKVM¥Î¤áªÅ¶¡¹ê¨Ò
1.5.1 ³Ð«ØµêÀÀ¾÷¹ê¨Ò
1.5.2 ³Ð«Ø¤º¦s
1.5.3 ³Ð«Ø³B²z¾¹
1.5.4 Guest
1.5.5 ¸ü¤JGuestÃè¹³¨ì¤º¦s
1.5.6 ¹B¦æµêÀÀ¾÷
²Ä2³¹ ¤º¦sµêÀÀ¤Æ
2.1 ¤º¦s©w§}
2.1.1 ¬q¦¡©w§}
2.1.2 ¥©Z¤º¦s¼Ò«¬
2.1.3 ¶¦¡©w§}
2.1.4 ¶¦¡©w§}¹ê¨Ò
2.2 VMM¬°Guest·Ç³Æª«²z¤º¦s
2.2.1 ¤º®Ö¬O¦p¦óÀò¨ú¤º¦sªº
2.2.2 «Ø¥ß¤º¦s¬q«H®§
2.2.3 ·Ç³Æ¤¤Â_0x15ªº³B²z¨ç¼Æ¥H¤Î³]¸mIVT
2.2.4 ¤¤Â_0x15ªº³B²z¨ç¼Æ¹ê²{
2.2.5 µêÀÀ¤º¦s±ø
2.3 ¹ê¼Ò¦¡Guestªº©w§}
2.3.1 ³]¸mCPU¹B¦æ©óVirtual-8086¼Ò¦¡
2.3.2 ³]¸mGuest¼Ò¦¡¤Uªºcr3±H¦s¾¹
2.3.3 µêÀÀMMUªº¤W¤U¤å
2.3.4 ¯Ê¶²§±`³B²z
2.4 «OÅ@¼Ò¦¡Guestªº©w§}
2.4.1 °½±ç´«¬Wcr
2.4.2 ¼v¤l¶ªí¯Ê¶²§±`³B²z
2.5 EPT
2.5.1 ³]¸mEPT¶ªí
2.5.2 EPT²§±`³B²z
2.5.3 EPT¤ä«ù¤Uªº¦a§}½Ķ¹Lµ{
²Ä3³¹ ¤¤Â_µêÀÀ¤Æ
3.1 µêÀÀ¤¤Â_
3.2 PICµêÀÀ¤Æ
3.2.1 ¥i½sµ{¤¤Â_±±¨î¾¹8259A
3.2.2 µêÀÀ³]³Æ¦VPICµo°e¤¤Â_½Ð¨D
3.2.3 °O¿ý¤¤Â_¨ìIRR
3.2.4 ³]¸m«Ý³B²z¤¤Â_¼ÐÃÑ
3.2.5 ¤¤Â_µû¦ô
3.2.6 ¤¤Â_ACK
3.2.7 Ãö©óEOIªº³B²z
3.2.8 ¤¤Â_ª`¤J
3.3 APICµêÀÀ¤Æ
3.3.1 ¥~³]¤¤Â_¹Lµ{
3.3.2 ®Ö¶¡¤¤Â_¹Lµ{
3.3.3 IRQ routing
3.4 MSI¡]X¡^µêÀÀ¤Æ
3.4.1 MSI¡]X¡^ Capability¼Æ¾Úµ²ºc
3.4.2 «Ø¥ßIRQ routingªí¶µ
3.4.3 MSI³]³Æ¤¤Â_¹Lµ{
3.5 µwÅéµêÀÀ¤Æ¤ä«ù
3.5.1 µêÀÀ¤¤Â_±H¦s¾¹¶±¡]virtual-APIC page¡^
3.5.2 Guest¼Ò¦¡¤Uªº¤¤Â_µû¦ôÅÞ¿è
3.5.3 posted-interrupt processing
²Ä4³¹ ³]³ÆµêÀÀ¤Æ
4.1 ³]³ÆµêÀÀ¤Æ¼Ò«¬ºt¶i
4.2 PCI°t¸mªÅ¶¡¤Î¨ä¼ÒÀÀ
4.3 ³]³Æ³z¶Ç
4.3.1 µêÀÀ°t¸mªÅ¶¡
4.3.2 DMA«¬M®g
4.3.3 ¤¤Â_«¬M®g
4.4 §¹¥þµêÀÀ¤Æ
4.4.1 Guestµo°e¼Æ¾Ú
4.4.2 Guest±µ¦¬¼Æ¾Ú
²Ä5³¹ VirtioµêÀÀ¤Æ
5.1 I/O´Ì
5.1.1 ¤å¥ó¨t²Î
5.1.2 ³q¥Î¶ô¼h
5.1.3 ¶ô³]³ÆÅX°Ê
5.1.4 page cache
5.1.5 bio
5.1.6 I/O½Õ«×¾¹
5.2 Virtio¨óij
5.2.1 ´yz²Åªí
5.2.2 ¥i¥Î´yz²Å°Ï°ì
5.2.3 ¤w¥Î´yz²Å°Ï°ì
5.2.4 Virtio³]³ÆªºPCI°t¸mªÅ¶¡
5.3 ªì©l¤ÆVirtqueue
5.4 ÅX°Ê®Ú¾ÚI/O½Ð¨D²Õ´´yz²ÅÃì
5.5 ÅX°Ê³qª¾³]³Æ³B²z½Ð¨D
5.6 ³]³Æ³B²zI/O½Ð¨D
5.7 ÅX°Ê°¼¦^¦¬I/O½Ð¨D
5.8 ³]³Æ«D¦P¨B³B²zI/O
5.9 »´¶qµêÀÀ¾÷°h¥X
5.9.1 ³Ð«Øeventfd
5.9.2 kvmtoolºÊÅ¥eventfd
5.9.3 VMexit³B²z¨ç¼Æ³ê¿ôI/O¥ô°È
²Ä6³¹ ºô¸ôµêÀÀ¤Æ
6.1 °ò©óOverlayªºµêÀÀºô¸ô¤è®×
6.1.1 pºâ¸`ÂI
6.1.2 ºô¸ô¸`ÂI
6.1.3 Open vSwitch
6.2 µêÀÀ¾÷³X°Ý¥~³¡¥D¾÷
6.2.1 ¼Æ¾Ú¥]¦bpºâ¸`ÂILinuxºô¾ô¤¤ªº³B²z
6.2.2 ¼Æ¾Ú¥]¦bpºâ¸`ÂIªºOpen vSwitch¤¤ªº³B²z
6.2.3 ¼Æ¾Ú¥]¦bºô¸ô¸`ÂIªºOpen vSwitch¤¤ªº³B²z
6.3 ¥~³¡¥D¾÷³X°ÝµêÀÀ¾÷
6.3.1 ¼Æ¾Ú¥]¦bºôÃö¤¤ªº³B²z¹Lµ{
6.3.2 ¼Æ¾Ú¥]¦