Linux 仮想化 KVM-Qemu Virtio デバイスの分析

Linux 仮想化 KVM-Qemu Virtio デバイスの分析

  [[381734]]

この記事はWeChatの公開アカウント「LoyenWang」から転載したもので、著者はLoyenWangです。この記事を転載する場合は、LoyenWang公式アカウントまでご連絡ください。

背景

  • ソースコードを読んでみろよ! --魯迅著
  • 一枚の写真は千の言葉に値する。 --ゴーリキー著

例:

  1. KVM バージョン: 5.9.1
  2. QEMU バージョン: 5.0.0
  3. ツール: Source Insight 3.5、Visio
  4. この記事はブログガーデンで同期されています: https://www.cnblogs.com/LoyenWang/

新しい年も、みんなで最高になりましょう!

女性の皆様へ:

世界の美しさ、...

男性に願い事:

あけましておめでとう。

1. 概要

まず、写真です。

  • この図には、Virtio デバイス、Virtio ドライバー、Virtqueue、通知 (eventfd/irqfd) の 4 つの主要モジュールがリストされています。
  • Virtio ドライバー: ユーザー要求を処理し、I/O 要求をバックエンドに転送するフロントエンド部分。
  • Virtio デバイス: Qemu によって実装されたバックエンド部分は、フロントエンドから I/O 要求を受信し、物理デバイスを介して I/O 操作を実行します。
  • Virtqueue: データ転送に使用される中間層部分。
  • 通知: 非同期イベントの通知に使用される対話型モード。

これら 4 つのモジュールを 1 つの記事で書き終えるのは簡単すぎると思われるため、別のシリーズの記事になると思われます。

この記事は、Qemu 側の virtio デバイスから始まります。実際のデバイス、そうです、前回の記事で言及したネットワークデバイスから説明することを選択します。

2. プロセス分析

Qemu がネットワーク カードを仮想化する場合、通常は次の図に示すように、仮想ネットワーク カード フロント エンドと仮想ネットワーク カード バックエンドが作成されます。

  • 仮想マシンを作成するときに、次のパラメータを指定します: -netdev tap, id = tap0, -device virtio-net-pci, netdev=tap0;
  • Tap ネットワーク カード バックエンド デバイスを作成します。
  • Virtio-Net ネットワーク カード フロントエンド デバイスを作成します。
  • ネットワーク カードのフロントエンド デバイスはバックエンド デバイスと対話し、最終的にホスト ドライバーとのデータ送受信を完了します。

全文は Tap デバイスと Virtio-Net デバイスの作成を中心に展開されています。

エントリー手順は以下のとおりです。

  • Qemu のコードは、さまざまな複雑さとオブジェクト指向の考え方があり、非常に読みにくいです。まずは自分で穴を掘り、それから詳しく調べてみようと思います。これはあなたのためのものです。私の言葉はあなたに届きます。
  • 図には、この記事に関連する 3 つのモジュールがあります。1) モジュールの初期化。 2) ネットワークデバイスの初期化3) デバイスの初期化
  1. Qemu のデバイス シミュレーションは type_init を通じてシステムにコンパイルされ、図の xxx_register_types のように module_call_init 中にコールバックが行われます。これらの関数では、TypeInfo 型情報に基づいて特定の実装が作成されます。
  2. net_init_client は、Tap デバイスなどのネットワーク デバイスを作成するために使用されます。
  3. device_init_func は、Qemu コマンドによって渡されたパラメータに基づいて、Virtio-Net などの仮想デバイスを作成します。

詳細を見ていきましょう。悪魔は細部に宿る。

3. タップ作成

上記から、Tap と Virtio-Net はフロントエンドとバックエンドの関係に属し、最終的には次の図に示すように構造を通じて互いを指していることがわかります。

  • NetClientState は、ネットワーク デバイス内の複数のエンドポイントを表す、ネットワーク カード シミュレーションのコア構造です。 2 つのエンドポイントがピアを介して相互を指します。

Tap デバイスを作成する主なタスクは、NetClientState 構造を作成し、それを net_clients リストに追加することです。

関数呼び出しの詳細は次のとおりです。

  • 処理フローはコア処理フローのみに焦点を当てています。プロセス全体では入力パラメータに関連する処理が多数ありますが、これらは選択的に無視されます。
  • net_tap_init: ホストの tun ドライバーと対話し、基本的にデバイス ファイルを開いて対応する構成を実行します。
  • net_tap_fd_init: net_tap_info 構造に従って NetClientState を作成し、関連する設定を行います。 net_tap_info 構造体の受信関数ポインタは、実際のデータ送信処理に使用されます。
  • tap_read_poll は、非同期応答のために Qemu の AioContext に fd を追加するために使用されます。データが到着すると、イベントがキャプチャされ、処理されます。

上記は Tap バックエンドの作成プロセスです。次のようにフロントエンドを作成します。

4. virtio-netの作成

これは複雑なプロセスです。

4.1 データ構造

Qemu はデバイスを抽象化するために C 言語でオブジェクト指向モデルを実装します。それは素晴らしい!

Virtio-Net デバイスの場合、構造とトポロジの構成は次のとおりです。

  • DeviceState はすべてのデバイスの親クラスであり、VirtIODevice と PCIDevice はそこから派生しており、本稿で検討する Virtio-Net は VirtIODevice から派生しています。
  • Qemu は PCI バスを仮想化し、virtio-net-pci、virtio-balloon-pci、virtio-scsi-pci などの PCI プロキシ デバイスを作成します。これらのプロキシ デバイスは PCI バスにマウントされます。同時に、VirtIONet などの最終デバイスをマウントするための Virtio バスが作成されます。
  • PCI プロキシ デバイスはリンクです。

4.2 プロセス分析

デバイス作成に関連する 3 つの関数は、device_init_func エントリから追跡できます。

  • Qemu コマンドが -device を通じてパラメータを渡すと、device_init_func はパラメータに基づいてデバイスを検索し、最終的にクラス初期化関数、オブジェクト初期化関数、およびデバイスに対応する実現関数を呼び出します。
  • したがって、私たちの分析は次の 3 つの入り口です。

4.2.1 クラス初期化

  • NIC 仮想化プロセス中、パラメータには PCI プロキシ デバイス、つまり -device virtio-net-pci, netdev=tap0 のみを指定する必要があります。これにより、virtio_net_pci_class_init 関数が呼び出されます。
  • クラスの継承関係が実装されているため、サブクラスを初期化する前に親クラスの実装を呼び出す必要があります。この図には継承関係と関数の呼び出し順序も示されています。
  • 継承は C 言語で実装されており、つまり、親オブジェクトはそれ自身の構造の先頭に配置されます。これは図の色で確認できます。

4.2.2 インスタンス初期化

クラスの初期化後、オブジェクトの作成が始まります。

  • Virtio-Net-PCI のインスタンス化は比較的簡単です。プロキシとして、後継オブジェクト (この記事ではフロントエンド デバイス Virtio-Net) の初期化を担当します。

4.2.3 実現する

  • realize の呼び出しはより複雑です。つまり、クラスの継承関係には複数の realize 関数ポインターがあり、最終的には親クラスから実行され、子クラスに呼び出されます。これらの関数ポインターはいつ初期化されますか?そうです、class_init クラスが初期化されるときに割り当てられます。詳細は示されていないが、結論は信頼できる。
  • 最終的な呼び出し関係は図のようになります。

これまでのところ、Virtio-Net デバイスの関連する操作は確認されていないようです。心配しないでください。私たちは真実に非常に近づいています。

  • virtio_net_pci_realize 関数は、一般的な virtio デバイス実装関数である virtio_device_realize の呼び出しをトリガーします。すべての virtio デバイスがこれを呼び出し、フロントエンド デバイス Virtio-Net も virtio デバイスです。
  • virtio_net_device_realize が私たちの主人公です。 virtio の共通設定(後ほどデータ通信で分析します)を実行します。また、Tap デバイスに対応する NetClientState エンドポイントを作成し、相互にポイントし、相互に共感し、相互の安全を維持します。
  • virtio_bus_device_plugged は、デバイスがバスに接続されたときの処理を示します。完了した作業は、ゲスト OS 内の virtio ドライバーと対話できるように、PCI バス計画に従ってさまざまな情報を構成することです。次の記事でそれを分析します。

この記事では、基本的に、仮想ネットワーク カードのフロントエンド デバイスとバックエンド デバイスの作成プロセスについて説明します。完成した作品は、まさにお互いを結びつけている。データのやり取りと通知のメカニズムについては、後続の処理に残されます。

参照する

「仮想 I/O デバイス (VIRTIO) バージョン 1.1」

https://www.redhat.com/en/blog/virtio-devices-and-drivers-overview-headjack-and-phone

<<:  2021年春節紅包合戦を通して中国のAIインフラ構築を見る

>>:  仮想マシンよりも軽量で、DockerやWSLよりもシンプルなLinux環境

推薦する

楊衛清:地域化と認識の要素を持つサービスには最も多くのビジネスチャンスがある

8月2日、2日から5日まで北京でMacworld Asia 2012 Digital World A...

新しい消費者ブランドのためのKOLマーケティングの秘訣

近年、新しい消費者ブランドが集団的に台頭し、 KOLマーケティング戦略の面では、製品プロモーション、...

sharknode-$6/Xen/512m メモリ/25G ハードディスク/500G トラフィック/ダラス

Sharknodeは、新たに40%オフの生涯割引WHT40を開始しました。XEN PVに基づくすべて...

cloudcone: クリスマスプロモーション、2.5ドルから、1Gメモリ、China Unicomスピードボーナス、高い防御力

cloudcone、今年のクリスマスプロモーションが到来、6つのKVM仮想VPSが販売中、コストパフ...

SEO最適化キーワードに関する議論

SEO 最適化に関して言及しなければならないことの 1 つは、キーワードの最適化です。SEO 最適化...

Adobeのウェブサイトがハッキングされ、15万人のユーザー情報が盗まれる

11月15日のニュース: 同社のサービスのセキュリティ問題が再び注目を集めているが、今回はFlash...

Baidu の「ビッグアップデート」により、ユーザーエクスペリエンスが再び向上。Baidu 関連情報は 2 ページ目の上部に表示されます

数回の大規模なKステーション調整の後、Baiduは本日、さらに大きなアップデートを実施しました。まず...

robots.txt のセキュリティ問題により、すべてのランキングが下がりました。2 日間で回復するにはどうすればよいでしょうか?

前回の記事「地方の業界ウェブサイトを運営する際には、ウェブサイトのrobots.txtのセキュリティ...

最も安いアメリカの VPS 販売業者である racknerd が、最も安い VPS をリストアップしてみんなと共有します。

格安 VPS 販売業者の Racknerd は、設立以来、低価格で安価な VPS 路線を追求してきま...

適切なSEO診断を行う方法

2009年頃から、私たちは徐々に「SEO診断」という言葉に触れるようになりました。現在まで、この言葉...

SEO: ウェブサイトのトラフィックが減少した場合の対処法

元の URL: http://www.clickz.com/showPage.html?page=3...

新年最初の仕事の日に、本番環境の分散ファイルシステムがクラッシュしました!

[[383073]]著者は、正確にスケジュールされたタスクと遅延キュー処理機能を備えた、高同時実行シ...

静的ページと動的ページ、検索エンジンはどちらを優先するのでしょうか?

ウェブサイトの最適化に関して言えば、静的ページと動的ページのどちらが優れているかは、多くの最適化担当...

新しいウェブサイトは、微調整によって古いウェブサイトと競争しながら飛躍的な成長を達成するにはどうすればよいでしょうか?

変化のないウェブサイトが検索エンジンのサポートを得られるというわけではありません。検索エンジンは、常...