Системные вызовы (как оно происходит на самом деле?)

Взгляд изнутри

Модератор: Модераторы разделов

Ответить
frp
Сообщения: 1445
ОС: Debian Squeeze

Системные вызовы

Сообщение frp »

Начал осиливать защищенный режим x86. Сразу же возникло несколько вопросов:
Как на самом деле происходят системные вызовы? В Linux, как и в некоторых других Unix-Like OS для x86, системный вызов можно осуществить инструкцией int 0x80. Но сразу возникает много вопросов:
1. В защищенном режиме любая функция, вызванная из ring 3, будет выполнена в ring 3. Приложение никак не может повысить свой уровень привилегий. КАКИМ ОБРАЗОМ в таком случае обработчик прерывания 0x80 умудряется работать в ring 0? Или он работает в ring 3 и с ядром связывается средствами IPC?
2. Насколько я понимаю, адресные пространства пользовательских процессов и ядра разделены. Обработчик прерывания 0x80 находится в ядре. Как приложение получает к нему доступ?
3. Приложение, насколько я понимаю, не имеет доступа к IDT (по причине разделения адресных пространств). Как оно узнает, куда передать управление?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Системные вызовы

Сообщение serzh-z »

1. Приложение вызывает функцию int процессора. int выполняется в третьем кольце, всё верно. =)
2. Приложение не получает прямой доступ к обработчику прерывания. Это делает микрокод процессора для инструкции int. Т.е. int - является посредником между приложением и обработчиком прерывания.
3. Записи IDT содержат поле DPL, которое описывают права доступа к целевому сегменту (ссылка на который так же сохранёна в составе записи IDT) - никто не мешает добавить запись в IDT, которая будет указывать на код ядра (в данном случае - обработчик для int 0x80) и иметь DPL = 3 (т.е. позволять вызывать себя из кода с CPL = 3: проще говоря, из кода в Ring 3). Примерно так. )

frp писал(а):
10.10.2010 14:38
Или он работает в ring 3 и с ядром связывается средствами IPC?
Что значит средствами IPC? =) IPC так же предполагает использование int 0x80 и переключение контекста задач со всеми вытекающими (сохранение старого контекста, копирование стека из Ring 3 в Ring 0, вызов реальной функции в Ring 0, копирование результатов обратно в стек приложения на Ring 3, восстановление конктеста задачи).
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Системные вызовы

Сообщение frp »

serzh-z писал(а):
11.10.2010 01:40
1. Приложение вызывает функцию int процессора. int выполняется в третьем кольце, всё верно. =)
2. Приложение не получает прямой доступ к обработчику прерывания. Это делает микрокод процессора для инструкции int. Т.е. int - является посредником между приложением и обработчиком прерывания.
3. Записи IDT содержат поле DPL, которое описывают права доступа к целевому сегменту (ссылка на который так же сохранёна в составе записи IDT) - никто не мешает добавить запись в IDT, которая будет указывать на код ядра (в данном случае - обработчик для int 0x80) и иметь DPL = 3 (т.е. позволять вызывать себя из кода с CPL = 3: проще говоря, из кода в Ring 3). Примерно так. )

Спасибо. Теперь чуть более понятно.
Спасибо сказали:
Ответить