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環境

推薦する

VPSにスピードテストをインストールしてアップロードとダウンロードの速度をテストします

私は Debian/Ubuntu を使用することを好みます。ここでは、VPS で speedtest...

顧客と親密なパートナーになる秘訣(パート 1)

私はデザイン業界で10年間働いてきました。オンライン小説の執筆者から現在のチーフクリエイティブディレ...

クラウド コンピューティング リソースのサイズ設定時に避けるべき 10 の間違い

[[391889]]組織が業務をクラウドに移行するときに直面する最も一般的な問題の 1 つはコストで...

#独立記念日: lunarpages-50% オフ/無料 com/net ドメイン名/cpanel パネル/無制限のウェブサイト構築/Alipay

Lunarpages は、米国独立記念日の割引コードをリリースしました。この割引コードは、仮想ホステ...

中小企業はまだSEO採用を行っていますか?プロセス全体をカバーするトップSEOソリューション

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています昨今、オン...

ボックス検索からボックスサービスへ: 検索の進化の方向

ユーザーは、スーパーで何を食べるか、何を買うかなど、直前の行動ですぐに結果を求めるためにモバイル検索...

URL www.***.com の外部リンクを分析することの長所と短所

最近、a5 でニュース記事をいくつか閲覧していたところ、多くの記事にウェブマスターの友人がさまざまな...

Qiyi Marketing MobileとAiyouyouは戦略的提携を結び、パートナーに香港とマカオへの無料ツアーを提供する。

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています最近、Qi...

3つのアルゴリズムによる外部リンクの重要性の簡単な分析

Fuqing SEO は検索エンジンのアルゴリズムについて詳細な調査を実施したことはありませんし、詳...

Webmaster.com の毎日のレポート: Suning と Redbaby が合併し、1 兆元を超える共同購入取引を達成

1. SuningがRedbabyのトップ経営陣を刷新。次のRedbabyは誰になるのか?レッドベイ...

「小さな壊れた放送局」ビリビリ:短編動画が限界点となるか?

Bilibiliは、コンテンツの質、コミュニティの雰囲気、ユーザーの忠誠心、活動のおかげで、Z世代の...

#ニュース# RackNerd バックエンドに、ユーザーがワンクリックで IPv4 に切り替えられる新機能が追加されました

ユーザーによっては、調和化などさまざまな理由で VPS の IPv4 を変更する必要がある場合があり...

ウェブサイトがKになった理由の分析

ほとんどのウェブマスターにとって、自分のウェブサイトが K-ed されるのは非常に辛いことです。それ...

ランディングページ最適化の7つのルール

この記事は、ランディング ページの最適化で実行できることを制限することを意図したものではありません。...

Gaopeng.comの成都支店は強制的な人員削減を実施し、全従業員の電子メールがブロックされたと報じられている。

「3つのグループの合併」はGaopeng.comの下落傾向を止めることはできなかった。昨日、グルーポ...