2015-02-22 2 views
1

Так что я знаю, что системный вызов (например, open, close, read, write и т. Д.) Дважды меняет бит режима - от режима пользователя до режима ядра, чтобы обслуживать запрос системного вызова, а затем обратно в пользовательский режим после его завершения.изменяет бит режима при инициализации переменной?

Но если у нас есть, например

int a = open("lol.txt", O_RDONLY); 

бит режим будет меняться еще дважды, чтобы служить системный вызов open, но то, что о том, когда он присваивает его переменной? Предполагая, что необходимо сохранить переменную в памяти, нужно ли нам вернуться к ядру для повторного запроса этого запроса? то есть, бит режима изменяется 2 или 4 раза в вышеуказанной строке?

+0

Возможный дубликат [Что такое вызывающие соглашения для системных вызовов UNIX и Linux на x86-64] (http://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix- linux-system-calls-on-x86-64) – xmojmr

+0

@xmojmr, если вы прочитаете вопрос, вы поймете, что это не так. – sparta123

+0

Я считаю, что ответ лежит на [ABI] (http://en.wikipedia.org/wiki/Application_binary_interface), и стало бы ясно, если вы воспользуетесь опцией вашего компилятора для генерации выходного файла исходного кода. Ответ: ** нет **, и причина в том, что системный вызов возвращает все, что он должен сделать обратно в пользовательский режим, через регистры и прямую запись в память. Перетасовка с переменными (локальная, глобальная, изменчивая, что угодно ..) полностью выходит за рамки системного вызова. «ABI» указывает, что будет использоваться в качестве каналов ввода-вывода, а локальных переменных нет в списке. – xmojmr

ответ

2

В случае возникновения грубой чрезмерной упрощенности единственным способом войти в режим ядра являются исключение (ловушка или ошибка) или прерывание.

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

 TRAP #100 ; call the 100th exception handler 

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

REI ; return from exception or interrupt 

процессорный возвращается в пользовательский режим.

open() может быть или не быть действительным системным сервисом. То есть, одна из оберток, которую я только что описал. Это зависит от системы. Возможно, что open() может быть библиотечной функцией, которая вызывает несколько системных служб, и в этом случае процессор перейдет в режим ядра и обратно несколько раз.

Если open() является системным сервисом, вы, вероятно, переходите в режим ядра и обратно только один раз.

Открытая функция, независимо от того, является ли она системной службой или нет, будет неизменно возвращать значение в регистре. Хранение значения - это простая инструкция перемещения.