Я пишу небольшую ОС, которая будет выполнять некоторый код в пользовательском режиме (уровень привилегий 3). Из этого кода пользовательского уровня я хочу вызвать прерывание обратно в ОС, которая печатает сообщение. Прямо сейчас мне все равно, как мой обработчик прерывания принимает аргументы или что-то в этом роде, я просто хочу, чтобы обработчик прерывания информировал меня (пользователя) о выполнении кода.
Мой вопрос: как мне запустить код в пользовательском режиме? У меня есть функция, которая устанавливает локальную таблицу дескрипторов с сегментом кода и сегментом данных (оба с привилегиями пользовательского режима). Я не понимаю, как я должен загружать эти сегменты в cs
, ss
и ds
. Я успешно загружаю свой LDT, но не знаю, как его использовать. Я слышал, что мне следует использовать iret
, но я не понимаю, как именно.
Другой вопрос, который у меня есть, - как должен работать мой обработчик прерываний. Допустим, я устанавливаю обработчик прерывания для вектора номер 0x40, который я хочу напечатать «привет, пользовательский режим!». Я знаю, как настроить обработчик прерывания, но я не совсем понимаю, как будет переключаться контекст при входе в обработчик прерывания ядра из пользовательского режима. Я знаю, что регистр cs
должен измениться, поскольку моя процедура будет выполняться из сегмента кода, указанного в моей записи IDT. Я также понимаю, что, вероятно, изменится и селектор стека, но я не могу быть в этом уверен.
Не могли бы вы объяснить мне, какие изменения контекста выполняются при вызове логического элемента прерывания?