Я пытаюсь понять исходный код 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