#linux #linux-kernel #system-calls #trace #perf
#linux #linux-ядро #системные вызовы #трассировка #perf
Вопрос:
Я пытаюсь отслеживать все системные вызовы, вызываемые внутри виртуальной машины из хост-ОС. Я попробовал это на хосте:
perf trace -a | grep qemu
Это дает такой результат:
0.000 ( 0.000 ms): qemu-system-x8/7511 ... [continued]: poll()) = 0 Timeout
10.060 (10.043 ms): qemu-system-x8/7511 poll(ufds: 0x7f5d300008f8, nfds: 20, timeout_msecs: 10 ) = 0 Timeout
20.161 (10.079 ms): qemu-system-x8/7511 poll(ufds: 0x7f5d300008f8, nfds: 20, timeout_msecs: 10 ) = 0 Timeout
30.226 (10.044 ms): qemu-system-x8/7511 poll(ufds: 0x7f5d300008f8, nfds: 20, timeout_msecs: 10 ) = 0 Timeout
Кто-нибудь может объяснить, что это за вызовы, которые показаны в этом выводе? Вызываются ли эти системные вызовы внутри виртуальной машины? или они вызываются самой ОС хоста в ответ на вызовы, вызываемые виртуальной машиной?
Ответ №1:
Эти poll()
вызовы выполняются qemu
для проверки событий с виртуальной машины, которые ему необходимо обработать.
Системные вызовы, выполняемые внутри виртуальной машины, обычно невидимы для ОС хоста. (Имейте в виду, что виртуальная машина может работать под управлением ОС, отличной от Linux, или даже может вообще не запускать ОС.) Если вы хотите отследить эти вызовы, вам, вероятно, потребуется выполнить perf
их внутри виртуальной машины.
Комментарии:
1. Спасибо за ответ. На выходе также есть другие вызовы, такие как read, write, sigprocmask, madvise и т. Д. Они также вызываются qemu, а не виртуальной машиной? Или мы можем сказать, что это вызовы, которые qemu вызывает в ответ на вызовы, вызываемые внутри виртуальной машины?