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