Как работают системные вызовы?

Я понимаю, что пользователь может владеть процессом, и у каждого процесса есть адресное пространство (которое содержит действительные ячейки памяти, на которые этот процесс может ссылаться). Я знаю, что процесс может вызывать системный вызов и передавать ему параметры, как и любую другую библиотечную функцию. Похоже, это предполагает, что все системные вызовы находятся в адресном пространстве процесса за счет совместного использования памяти и т. Д. Но, возможно, это всего лишь иллюзия, созданная тем фактом, что на языке программирования высокого уровня системные вызовы выглядят как любая другая функция, когда процесс называет это.

Но теперь позвольте мне сделать шаг глубже и более внимательно проанализировать, что происходит под капотом. Как компилятор компилирует системный вызов? Возможно, он помещает имя системного вызова и параметры, предоставленные процессом, в стек, а затем помещает инструкцию сборки с надписью «TRAP» или что-то в этом роде - в основном инструкцию сборки для вызова программного прерывания.

Эта инструкция сборки TRAP выполняется с помощью аппаратного обеспечения, сначала переключив бит режима с пользователя на ядро, а затем установив указатель кода на начало подпрограмм обслуживания прерывания. С этого момента ISR выполняется в режиме ядра, который берет параметры из стека (это возможно, потому что ядро ​​имеет доступ к любому участку памяти, даже к тем, которые принадлежат пользовательским процессам) и выполняет системный вызов и в end освобождает CPU, который снова переключает бит режима, и пользовательский процесс начинается с того места, где он остановился.

Правильно ли я понимаю?

Приложена приблизительная диаграмма моего понимания: enter image description here

41
задан Aleksi Torhamo 16 December 2014 в 05:40
поделиться