Как выполняется настоящий системный вызов?

У меня есть вопрос о том, как выполняется фактический системный вызов. Я знаю, что магия системного вызова (например, чтение и т. д.) реализована в библиотеке C, но не понимаю точного механизма. Мои основные проблемы

  1. Процедура библиотеки c находится в адресном пространстве пользователя; тогда как он может получить адрес подпрограмм обслуживания прерывания. Предопределены ли процедуры обслуживания прерываний (при загрузке) в физической памяти?

  2. Даже если как-то процедура ISR вызывается, как меняется адресное пространство? Я имею в виду, прежде чем мы начнем выполнение ISR, как изменится «базовый регистр таблицы страниц», чтобы указать на таблицу страниц ядра. Если это делает подпрограмма 'C', то как она узнает адрес таблицы страниц ядра?

  3. Как параметры копируются из пространства пользователя в пространство ядра?

Пожалуйста, извините меня, если мои вопросы слишком простые, но я новичок в этом. :)

Спасибо, Рохит.


person Rohit    schedule 12.03.2014    source источник


Ответы (2)


В большинстве систем есть инструкция, которая может быть выполнена пользовательским кодом для вызова определяемого пользователем прерывания (например, int на x86 и swi на ARM запросит «программное прерывание»).

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

Ядро может проверять регистры и стек пользовательского режима, которые присутствовали во время вызова прерывания (аналогично сохранению всех регистров в стеке во время переключения контекста), и получать оттуда аргументы системного вызова.

person nneonneo    schedule 12.03.2014
comment
Как изменяется адресное пространство от режима пользователя к режиму ядра? - person Rohit; 12.03.2014

Хорошо, я думаю, что нашел ответ (по крайней мере, я так думаю) на вопросы о пространстве ядра

1. Подпрограмма библиотеки c находится в адресном пространстве пользователя; тогда как он может получить адрес подпрограмм обслуживания прерывания. Предопределены ли процедуры обслуживания прерываний (при загрузке) в физической памяти?

Расположение ISR предопределено, как ответил nneonneo выше.

2.Даже если как-то процедура ISR вызывается, как меняется адресное пространство? Я имею в виду, прежде чем мы начнем выполнение ISR, как изменится «базовый регистр таблицы страниц», чтобы указать на таблицу страниц ядра. Если это делает подпрограмма 'C', то как она узнает адрес таблицы страниц ядра?

Адресное пространство не меняется, так как пространство ядра практически такое же, как и у пользователей (разница только в уровне защиты).

person Rohit    schedule 13.03.2014