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 つのステップ

クラウド セキュリティ戦略により、企業は安全なクラウド環境で機器を運用し、ビジネスを遂行できるように...

山東東営あなたのコース製品は競争力、Facebookグループ制御マーケティング完全なネットワークレイアウト

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

電子商取引ウェブサイトのトラフィックの利点に含まれるSEO要素

トラフィックは、検索エンジンの可視性を判断する上で重要な要素です。ウェブサイト最適化にはさまざまな種...

あらゆるクラウドで実行: クラウドの移植性を検討しましたか?

クラウド ポータビリティは、スケーラブルで回復力のあるクラウド ネイティブ アプリケーションを構築す...

人気絶頂時に閉鎖された文学ウェブサイト:「ポルノをやめる」のはなぜ難しいのか?

はじめに:オンライン文学で「ポルノをやめる」のはなぜ難しいのでしょうか?それはトラフィックツールだか...

ファーウェイ、「プレミアムプライベートライン2.0&インテリジェント分散アクセス」ソリューションをリリース

[中国、北京、10月15日] 今年9月、ファーウェイはファーウェイコネクトカンファレンスで「インテリ...

サイトを定期的かつ定量的に更新します。まだ続けている人はいますか?

ウェブサイトの最適化は、多くの分野からなる非常に包括的なタスクです。しかし、最も基本的な最適化作業と...

Baiduの経験から、検索の重みが高いのはSEO内部ページの最適化によるものだとわかる。

Baidu のウェイトプロモーションを行ったことがある友人は皆、Baidu で内部リンクと外部リンク...

フォーラムの人気の源を見つける4つの方法を共有する

フォーラムの発展は人気にかかっています。人気はフォーラムにとって活力のある水源のようなものだと言えま...

企業のホームページ構築が低価格のホームページ構築会社を選ばない理由

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

B2C最適化の分析

B2C 電子商取引 Web サイトを構築してインターネットで収益を上げたい場合は、Web サイトをよ...

ウェブサイトの内部ページのランキングを向上させる方法をご存知ですか?

ウェブサイトの最適化では、内部ページのランキングがホームページのランキングを圧倒する現象がよく発生し...

リン・シウ:SEO の 20 のポイント

絶対にしてはいけない SEO の間違い 10 選1) フラッシュサイト(すべてフラッシュ) 2) フ...

月額5ドルで信頼できるVPS、ウェブサイト構築におすすめのVPS

多くの人がウェブサイトを構築するために VPS を購入しますが、ウェブサイト構築用の安価で信頼性の高...

fatcow 1ドル/年 感謝祭

Fatcow の今年最後の波 - 感謝祭とブラック フライデーのプロモーション、Fatcow は無制...