PCI スロット番号からゲスト OS が認識する PCI バストポロジへのマッピング
search cancel

PCI スロット番号からゲスト OS が認識する PCI バストポロジへのマッピング

book

Article ID: 427766

calendar_today

Updated On:

Products

VMware vSphere ESXi

Issue/Introduction

免責事項: これは英文の記事Mapping PCI slot numbers to guest-visible PCI bus topologyの日本語訳です。記事はベストエフォートで翻訳を進めているため、ローカライズ化コンテンツは最新情報ではない可能性があります。最新情報は英語版の記事を参照してください。


VMware 仮想マシンを記述する設定ファイル(拡張子 .vmx のファイル)には、仮想マシンの電源がオンになったときに、ハイパーバイザーによって NIC や HBA などの PCI または PCIe 仮想デバイスが接続される 永続的 PCI スロット番号のエンコード情報が含まれています。

この記事では、それらの 永続的 PCI スロット番号を、ゲスト OS 内で可視となる PCI バストポロジにマッピングするために使用される内部アルゴリズムについて説明します。この説明は、ゲスト OS 内のマルチインスタンス仮想デバイス(例:複数の VMXNET3  vNIC)を、仮想マシンの構成内にある仮想デバイスインスタンスにマッピングする際に役立ちます。

Environment

VMware vSphere ESXi 

Resolution

用語

  • PCI ブリッジ:
    2つのPCI バスを橋渡しするデバイス。

  • 永続的 PCI スロット
    仮想マシンの設定ファイル内でエンコードされた番号。ハイパーバイザーが仮想デバイスを仮想 PCI バストポロジ内の特定のクロススロットに接続するために使用されます。

  • プライマリ バス:
    PCI ブリッジの手前側にある PCI バス。

  • セカンダリ バス:
    PCI ブリッジの先にある PCI バス。

  • Bus:Dev:Func:
    デバイスの場所を示す論理的な PCI バストポロジ。ほとんどのデバイスはシングルファンクションであり、Func は常に0です。レガシー PCI デバイスは同じ バス上に複数のデバイスを持ちますが、 PCIe(ポイントツーポイント接続)は1つの バスに1つの PCIe デバイスを持ちます。

 

マッピングアルゴリズム

マッピングアルゴリズムは、以下のステップで説明できます:

  1. 仮想マシンの設定ファイルからデバイスの永続的 PCI スロット番号を確認します。:
    # egrep "ethernet4.pciSlotNumber" /path/to/VM/VM.vmx
    ethernet4.pciSlotNumber = "1216"


  2. 得られた PCI スロット番号を、以下のビットマップを使用してバイナリ(2進数)にエンコードします:

    FFF.BBBBB.DDDDD
    001.00110.00000 [1216 = 0x4C0]


  3. BBBBB が00000の場合、デバイスはプライマリ PCIバス上の Bus:Dev.Func 0:DDDDD.0に存在します:

    例:
    # egrep "pciBridge0.pciSlotNumber" /path/to/VM/VM.vmx
    pciBridge0.pciSlotNumber = "17"

    000.00000.10001 [17 = 0x11]
    Bus:Dev.Func = 00h:11h.00h

  4. BBBBB がゼロ以外の場合、デバイスはセカンダリ PCI バス上に存在します。PCI ブリッジデバイスを特定するには、BBBBB - 1 を計算します。 上記の ethernet4 (1216)の例では、BBBBB = 00110 です

    PCI ブリッジデバイス = BBBBB - 1 = 5 (仮想デバイス名 "pciBridge5")

  5. その PCI ブリッジの永続的 PCI スロット番号を確認します:
    # egrep "pciBridge5.pciSlotNumber" /path/to/VM/VM.vmx
    pciBridge5.pciSlotNumber = "22"
  6. 得られた PCI スロット番号をバイナリにエンコードします(ステップ2と同様):

    FFF.BBBBB.DDDDD
    000.00000.10110 [22 = 0x16]


  7. ステップ2のFFFと、ステップ6の DDDDD を組み合わせることで、 PCI ブリッジの Dev.Func が得られます:

    PCI ブリッジの Bus:Dev.Func = 00h:16h:01h
    (ステップ6からDev = 0x16 , ステップ2からFunc = 0x1)

  8. ブリッジの BBBBB がゼロ以外の場合は、ステップ4からのプロセスを繰り返し、親ブリッジを特定します.
  9. ステップ1で確認した仮想デバイスは、このセカンダリバス上の、ステップ2の Dev.Func DDDDD.0 に配置されます:

    00h:16h:01h の配下にあるセカンダリバス上の Dev.Func 00h:0h に位置するethernet4


備考:

  • e1000e、VMXNET3 vNIC、PVSCSI vHBA などの仮想 PCIe デバイスは、PCI ブリッジとしてポイントツーポイントのセカンダリ PCIe ルートポートに接続されるシングルトンデバイスです。そのため、それらの DDDDD エンコードは通常 0 になります。
  • e1000 vNIC や lsilogic vHBA などの仮想レガシー PCI デバイスは、共有セカンダリ PCI バスに接続される複数のデバイスとなります。そのため、それらの DDDDD エンコードは、セカンダリ PCI バス上のどのデバイスであるかを指定します。

Additional Information

Mapping PCI slot numbers to guest-visible PCI bus topology