Где в исходном коде Qemu вызывается KVM_RUN (или другие ioctl)? - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь понять исходный код QEMU. Я начал с основной функции и узнал много вещей о главном Glib l oop и событиях, определенных там. Тем не менее, я не мог найти ту часть, где запускается процессор. Поэтому у меня возникла идея искать имена ioctl KVM, потому что QEMU должен вызывать их где-нибудь, чтобы запускать и запускать виртуальные процессоры, если включена опция KVM. Я начал с KVM_RUN

Я обнаружил, что KVM_RUN ioctl называется здесь

https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/accel/kvm/kvm-all.c#L2346

, который живет внутри функция kvm_cpu_exec, которая вызывается здесь:

https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/cpus.c#L1246

, которая находится внутри функции qemu_kvm_cpu_thread_fn, которая вызывается / передается здесь как обратный вызов

https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/cpus.c#L2007

, который живет внутри функции qemu_kvm_start_vcpu, которая вызывается здесь

https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/cpus.c#L2076

который живет внутри qemu_kvm_start_vcpu, который живет insde x86_cpu_realizefn, в случае архитектуры i386:

https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/target/i386/cpu.c#L6472

, который живет внутри x86_cpu_common_class_init, то есть здесь вызывается:

https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/target/i386/cpu.c#L7231

, который определяется здесь как член структуры:

https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/target/i386/cpu.c#L7300

Тогда я просто достиг конца стека вызовов. Я не знаю, кто вызывает эту функцию, так как она определена как член структуры. Я не знаю названия объекта, поэтому я мог искать object->class_init( в коде.

Я пытался с другими ioctl, но в итоге я получаю то же самое.

Итак, где запускается процессор?

ps: я использовал vscode + microsoft cpp intellisense, чтобы быстро найти, где вызывается функция, я просто нажимаю кнопку Rigth на имени функции и "go до определения "

пс2: QEMU Main L oop начинается здесь: https://github.com/qemu/qemu/blob/17e1e49814096a3daaa8e5a73acd56a0f30bdc18/softmmu/main.c

...