Я понимаю, что пользователь может владеть процессом, и каждый процесс имеет адресное пространство (которое содержит действительные ячейки памяти, этот процесс может ссылаться). Я знаю, что процесс может вызвать системный вызов и передать ему параметры, как и любую другую библиотечную функцию. Это, по-видимому, предполагает, что все системные вызовы находятся в адресном пространстве процесса, разделяя память и т.д. Но, возможно, это только иллюзия, созданная тем, что на языке программирования высокого уровня системные вызовы выглядят как любая другая функция, когда процесс называет это.
Но теперь позвольте мне сделать шаг глубже и более подробно проанализировать, что происходит под капотом. Как компилятор компилирует системный вызов? Возможно, это подталкивает имя системного вызова и параметры, предоставляемые процессом в стеке, а затем помещает инструкцию сборки "TRAP" или что-то еще - в основном инструкция сборки для вызова программного прерывания.
Эта инструкция сборки TRAP выполняется аппаратным обеспечением, сначала переключая бит режима от пользователя к ядру, а затем устанавливая указатель кода, чтобы сказать начало процедур обслуживания прерываний. С этого момента ISR выполняется в режиме ядра, который выбирает параметры из стека (это возможно, потому что ядро имеет доступ к любой ячейке памяти, даже к тем, которые принадлежат пользовательским процессам) и выполняет системный вызов и в end отказывается от CPU, который снова переключает бит режима, и процесс пользователя начинается с того места, где он остановился.
Правильно ли я понимаю?
Прикрепленная грубая диаграмма моего понимания: