Начал осиливать защищенный режим 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: Системные вызовы
1. Приложение вызывает функцию int процессора. int выполняется в третьем кольце, всё верно. =)
2. Приложение не получает прямой доступ к обработчику прерывания. Это делает микрокод процессора для инструкции int. Т.е. int - является посредником между приложением и обработчиком прерывания.
3. Записи IDT содержат поле DPL, которое описывают права доступа к целевому сегменту (ссылка на который так же сохранёна в составе записи IDT) - никто не мешает добавить запись в IDT, которая будет указывать на код ядра (в данном случае - обработчик для int 0x80) и иметь DPL = 3 (т.е. позволять вызывать себя из кода с CPL = 3: проще говоря, из кода в Ring 3). Примерно так. )
2. Приложение не получает прямой доступ к обработчику прерывания. Это делает микрокод процессора для инструкции int. Т.е. int - является посредником между приложением и обработчиком прерывания.
3. Записи IDT содержат поле DPL, которое описывают права доступа к целевому сегменту (ссылка на который так же сохранёна в составе записи IDT) - никто не мешает добавить запись в IDT, которая будет указывать на код ядра (в данном случае - обработчик для int 0x80) и иметь DPL = 3 (т.е. позволять вызывать себя из кода с CPL = 3: проще говоря, из кода в Ring 3). Примерно так. )
Что значит средствами IPC? =) IPC так же предполагает использование int 0x80 и переключение контекста задач со всеми вытекающими (сохранение старого контекста, копирование стека из Ring 3 в Ring 0, вызов реальной функции в Ring 0, копирование результатов обратно в стек приложения на Ring 3, восстановление конктеста задачи).
Спасибо сказали:
Re: Системные вызовы
serzh-z писал(а): ↑11.10.2010 01:401. Приложение вызывает функцию int процессора. int выполняется в третьем кольце, всё верно. =)
2. Приложение не получает прямой доступ к обработчику прерывания. Это делает микрокод процессора для инструкции int. Т.е. int - является посредником между приложением и обработчиком прерывания.
3. Записи IDT содержат поле DPL, которое описывают права доступа к целевому сегменту (ссылка на который так же сохранёна в составе записи IDT) - никто не мешает добавить запись в IDT, которая будет указывать на код ядра (в данном случае - обработчик для int 0x80) и иметь DPL = 3 (т.е. позволять вызывать себя из кода с CPL = 3: проще говоря, из кода в Ring 3). Примерно так. )
Спасибо. Теперь чуть более понятно.