Я прочитал аналогичный ответ на вопрос о переключении контекста в StackOverflow: Как на самом деле работают функции schedule () + switch_to () из ядра Linux?
Однако Я все еще озадачен внутренними данными и не понимаю, как только что переключенный процесс (ранее прерванный) возобновит свое выполнение в пользовательском пространстве (если он там был прерван) в Linux.
Пока что общий поток переключения контекста (на v4.20
):
- процесс выполняется в пользовательском пространстве (скажем,
firefox
) - ЦПClock генерирует прерывание
- Планировщик называется
- __ schedule () называется
- , если новая задача (скажем,
systemd
) отличается от текущего, context_switch () вызывается - context_switch вызывает switch_to ()
- На этом этапе контекст процессора переключается на следующую задачу, включая стек и виртual адресное пространство
- предыдущее задание возвращается context_switch ()
На данный момент я не понимаю, что происходит:
-> Это новое заданиевыполняет?в коде switch_to
я не увидел ссылки на указатель инструкций используемой task_struct.
-> Как мой systemd
процесс продолжает выполняться в пользовательском пространстве?
-> Должны ли мы где-нибудь попасть в iret
?Я видел resume_kernel и resume_userspace символы в entry_32.S , но я не понимаю , как они подключены к планировщику.
-> Почему в структуре task_struct
-> thread
нет поля указателя инструкции?Как хранится и восстанавливается IP-адрес?
-> Включает ли переключение контекста evey прерывание, за которым следует iret
?И поэтому я могу положиться на этот факт, чтобы поймать переключение контекста (перехват загрузки CR3) и одиночный шаг, пока я не выполню iret
?
Примечание: я задаю вопрос, потому что я пытаюсьпостроить гипервизор уровня отладчика с поддержкой гостя .Поэтому я разрабатываю функциональность, подобную PTRACE_ATTACH
, но используя только API-интерфейсы VMI гипервизоров
Большое спасибо за ваше время и ответы!?