Может ли perf tool предоставить список системных вызовов, вызываемых внутри виртуальной машины?

#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 вызывает в ответ на вызовы, вызываемые внутри виртуальной машины?