Переключение в пользовательский режим с помощью iret

Я пишу небольшую ОС, которая будет выполнять некоторый код в пользовательском режиме (уровень привилегий 3). Из этого кода пользовательского уровня я хочу вызвать прерывание обратно в ОС, которая печатает сообщение. Прямо сейчас мне все равно, как мой обработчик прерывания принимает аргументы или что-то в этом роде, я просто хочу, чтобы обработчик прерывания информировал меня (пользователя) о выполнении кода.

Мой вопрос: как мне запустить код в пользовательском режиме? У меня есть функция, которая устанавливает локальную таблицу дескрипторов с сегментом кода и сегментом данных (оба с привилегиями пользовательского режима). Я не понимаю, как я должен загружать эти сегменты в cs , ss и ds . Я успешно загружаю свой LDT, но не знаю, как его использовать. Я слышал, что мне следует использовать iret , но я не понимаю, как именно.

Другой вопрос, который у меня есть, - как должен работать мой обработчик прерываний. Допустим, я устанавливаю обработчик прерывания для вектора номер 0x40, который я хочу напечатать «привет, пользовательский режим!». Я знаю, как настроить обработчик прерывания, но я не совсем понимаю, как будет переключаться контекст при входе в обработчик прерывания ядра из пользовательского режима. Я знаю, что регистр cs должен измениться, поскольку моя процедура будет выполняться из сегмента кода, указанного в моей записи IDT. Я также понимаю, что, вероятно, изменится и селектор стека, но я не могу быть в этом уверен.

Не могли бы вы объяснить мне, какие изменения контекста выполняются при вызове логического элемента прерывания?

12
задан Alex Nichol 31 July 2011 в 21:25
поделиться