Как в Linux процесс вызывает mmap() и добавляет VMA для своего дочернего элемента?
В документе для gvisor поясняется, что "часовой хранит эффективное сопоставление виртуального адреса с файлом хоста в хосте VMA, вызывая системный вызов mmap", так что процесс контейнерного приложения имеет информацию, необходимую для преобразования и доступа. запрошенный виртуальный адрес.
Здесь часовой относится к процессу гипервизора, который отслеживает контейнерный процесс дочернего приложения, который он порождает.
У меня вопрос, как именно дозвонился часовой mmap()
для процесса подачи заявки? Если он вызывает из своего собственного процесса, разве это не изменяет его собственную таблицу VMA вместо таблицы процесса приложения?
1 ответ
Бармар прав в комментариях выше.
ptrace
не предоставляет прямого механизма для выполнения системного вызова в трассируемом объекте. Ядро реализации gVisor можно найти здесь. Мы выбираем трассируемый поток, устанавливаем регистры с помощью RIP в известном месте инструкции SYSCALL + trap и устанавливаем регистры аргументов по желанию, а затем разрешаем продолжение выполнения через системный вызов и снова останавливаемся на trap.