Как в Linux процесс вызывает mmap() и добавляет VMA для своего дочернего элемента?

В документе для gvisor поясняется, что "часовой хранит эффективное сопоставление виртуального адреса с файлом хоста в хосте VMA, вызывая системный вызов mmap", так что процесс контейнерного приложения имеет информацию, необходимую для преобразования и доступа. запрошенный виртуальный адрес.

Здесь часовой относится к процессу гипервизора, который отслеживает контейнерный процесс дочернего приложения, который он порождает.

У меня вопрос, как именно дозвонился часовой mmap()для процесса подачи заявки? Если он вызывает из своего собственного процесса, разве это не изменяет его собственную таблицу VMA вместо таблицы процесса приложения?

1 ответ

Бармар прав в комментариях выше. ptraceне предоставляет прямого механизма для выполнения системного вызова в трассируемом объекте. Ядро реализации gVisor можно найти здесь. Мы выбираем трассируемый поток, устанавливаем регистры с помощью RIP в известном месте инструкции SYSCALL + trap и устанавливаем регистры аргументов по желанию, а затем разрешаем продолжение выполнения через системный вызов и снова останавливаемся на trap.

Другие вопросы по тегам