QEMU ソースコードの完全分析 1 - QEMU パラメータ分析 (1)

この記事の内容に関する参考文献:

「Linux オペレーティング システムに関する興味深い話」 —— Liu Chao、Geek Time

「QEMU/KVM」ソースコード分析とアプリケーション - Li Qiang、Machinery Industry Press

どうもありがとうございます!

1. QEMUパラメータ分析

QEMU ソース コードを分析するには、まず QEMU コマンド ラインから開始する必要があります。著者は、以前の QEMU 関連記事シリーズで、次のようないくつかの QEMU コマンドを紹介しました。

$ qemu-system-x86_64 -enable-kvm -m 8G -smp 4 -boot once=d -drive file=./Ubuntu22.img -cdrom ../iso_images/ubuntu-22.10-desktop-amd64.iso

このセクションでは、QEMU コマンド ライン パラメーターの解析について簡単に紹介し、読者が QEMU コマンド ライン パラメーターをコードでの実装と結び付けるのに役立ちます。QEMU のコマンド分析は、softmmu/vl.c の void qemu_init(int argc, char **argv) にある次のような内容の長いリストです。

    qemu_add_opts(&qemu_drive_opts);
    qemu_add_drive_opts(&qemu_legacy_drive_opts);
    qemu_add_drive_opts(&qemu_common_drive_opts);
    qemu_add_drive_opts(&qemu_drive_opts);
    qemu_add_drive_opts(&bdrv_runtime_opts);
    qemu_add_opts(&qemu_chardev_opts);
    qemu_add_opts(&qemu_device_opts);
    qemu_add_opts(&qemu_netdev_opts);
    qemu_add_opts(&qemu_nic_opts);
    qemu_add_opts(&qemu_net_opts);
    qemu_add_opts(&qemu_rtc_opts);
    qemu_add_opts(&qemu_global_opts);
    qemu_add_opts(&qemu_mon_opts);
    qemu_add_opts(&qemu_trace_opts);
    qemu_plugin_add_opts();
    qemu_add_opts(&qemu_option_rom_opts);
    qemu_add_opts(&qemu_accel_opts);
    qemu_add_opts(&qemu_mem_opts);
    qemu_add_opts(&qemu_smp_opts);
    qemu_add_opts(&qemu_boot_opts);
    qemu_add_opts(&qemu_add_fd_opts);
    qemu_add_opts(&qemu_object_opts);
    qemu_add_opts(&qemu_tpmdev_opts);
    qemu_add_opts(&qemu_overcommit_opts);
    qemu_add_opts(&qemu_msg_opts);
    qemu_add_opts(&qemu_name_opts);
    qemu_add_opts(&qemu_numa_opts);
    qemu_add_opts(&qemu_icount_opts);
    qemu_add_opts(&qemu_semihosting_config_opts);
    qemu_add_opts(&qemu_fw_cfg_opts);
    qemu_add_opts(&qemu_action_opts);

もちろん、他のファイルにも多くの qemu_add_opt が散在しているため、ここでは 1 つずつリストすることはせず、主要な行だけを把握します。

選択肢が多すぎると言う人もいるでしょう。それはそう。上記のコマンド パラメーターの例は、少なすぎるわけではありませんが、以下のコマンド ライン パラメーターと比較すると、「重要ではありません」。

$ qemu-system-x86_64 -enable-kvm 
                                           -name instance-00000024 
                                           -machine pc-i440fx-trusty,accel=kvm,usb=off 
                                           -cpu SandyBridge,+erms,+smep,+fsgsbase,+pdpe1gb,+rdrand,+f16c,+osxsave,+dca,+pcid,+pdcm,+xtpr,+tm2+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme 
                                           -m 2048 
                                           -smp 1,sockets=1,cores=1,threads=1 
                                           ……
                                           -rtc base=utc,driftfix=slew 
                                           -drive file=/var/lib/nova/instances/1f8e6f7e-5a70-4780-89c1-464dc0e7f308/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none 
                                           -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 
                                           -netdev tap,fd=32,id=hostnet0,vhost=on,vhostfd=37 
                                           -device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:d1:2d:99,bus=pci1.0,addr=0x3 
                                           -chrdev file,id=charserial0,path=/var/lib/nova/instances/1f8e6f7e-5a70-4780-89c1-464dc0e7f308/console.log 
                                           -vnc 0.0.0.0:12 
                                           -device cirrus-vga,id-video0,bus=pci.0,addr=0x2

これで、なぜこれほど多くの qemu_add_opt があるのか​​理解できたでしょうか。これらのパラメータを解析するだけでは実際には十分ではありません。

それでは、上記のパラメータは何を意味するのでしょうか? 以下、一つずつ詳しく紹介していきます。

  • 有効化-kvm

ハードウェア支援仮想化が有効であることを示します。

  • -name インスタンス-00000024

仮想マシンの名前を示します。

  • -マシン pci-i440fx-trusty、accel=kvm、usb=off

machine はコンピュータ アーキテクチャの略です。qemu はさまざまなアーキテクチャをシミュレートしますが、通常使用されるのは通常の PC、つまり x86 の 32 ビットまたは 64 ビット アーキテクチャ、Apple Mac コンピュータの PowerPC アーキテクチャ、Sun の SPARC アーキテクチャ、MIPS のアーキテクチャなどです。KVM ハードウェア支援仮想化を使用し、純粋なシミュレーションを使用する場合は、パラメーター accel=tcg、-no-kvm があります。

  • -cpu SandyBridge、+erms、+smep、+fsgsbase、+pdpe1gb、+rdrand、+f16c、+osxsave、+dca、+pcid、+pdcm、+xtpr、+tm2+est、+smx、+vmx、+ds_cpl 、+モニター、+dtes64、+pbe、+tm、+ht、+ss、+acpi、+ds、+vme

これは CPU を設定することを意味します。SandyBridge は Intel プロセッサーであり、背後にあるものはすべて追加された CPU パラメーターであり、/proc/cpuinfo に表示されます。

  • -m 2048

使用されているメモリのサイズを示します。

  • -smp 1、ソケット = 1、コア = 1、スレッド = 1

SMP は対称マルチプロセッサ (UMA) であり、NUMA に対応します。qemu は、1 つの vcpu、1 つのソケット、1 つのコア、および 1 つのスレッドを備えたプロセッサをエミュレートします。

ソケット、コア、スレッドの概念は何ですか? ソケットは、CPU が挿入されるマザーボード上のスロットの数であり、「ロード」とも呼ばれます。core とはデュアルコア、クアッドコアなどよく言われる「コア」のことです。スレッドは、コアあたりのハードウェア スレッドの数、つまりハイパースレッディングを指します。

  • -rtc ベース=utc、ドリフトフィックス=スルー

システム時刻がパラメータ -rtc で指定されることを示します。

  • -device cirrus-vga、id=video0、bus=pci.0、addr=0x2

ディスプレイがパラメータ -vga で設定されていることを示します。デフォルトは cirrus で、CL-GD5446PCI VGA カードをシミュレートします。

  • -netdev タップ、fd=32、id=hostnet0、vhost=on、vhostfd=37 

HOST の観点から見た NIC 関連の設定。

  • -device virtio-net-pci、netdev=hostnet0、id=net0、mac=fa:16:3e:d1:2d:99、bus=pci1.0、addr=0x3 

GUEST の観点から見た NIC 関連の設定。

注: ネットワーク カード デバイスは、-net パラメータと -device パラメータを使用して設定されます。

  • -drive file=/var/lib/nova/instances/1f8e6f7e-5a70-4780-89c1-464dc0e7f308/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none

HOST の観点から見たハードディスク関連の設定。

  • -device virtio-blk-pci、scsi=off、bus=pci.0、addr=0x4、drive=drive-virtio-disk0、id=virtio-disk0、bootindex=1

GUEST の観点から見たハードディスク関連の設定。

注: ハードディスク デバイスは、-hda、-hdb、または -drive および -device パラメータを使用して設定されます。

  • -vnc 0.0.0.0:12

VNCを設定します。

上記のコマンドラインのパラメータは基本的に解析されます。もちろん、これはほんの一部です。落胆しないでください。現時点ですべてを理解する必要はありません。大まかに理解するだけで十分です。

では、これほど多くのパラメーターは QEMU によってどのように解析されるのでしょうか? 次回はその内訳を見てみましょう。

おすすめ

転載: blog.csdn.net/phmatthaus/article/details/131505960