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