(Написание ядра) Как изменить таблицу дескрипторов прерываний?

Я пишу небольшое ядро ​​только для того, чтобы немного разобраться с низкоуровневыми вещами. Прямо сейчас он загружается в Virtual Box, и я могу отображать текст на экране, выделять немного памяти и выполнять другие действительно простые вещи. Он написан на C++ и немного на ассемблере.

Одной из вещей, которую я хотел изучить, был механизм, лежащий в основе многозадачности. Насколько я понимаю, это происходит примерно так:

  1. Ядро инициализирует таблицу дескрипторов прерываний, так что прерывание выдается периодически (например, миллисекунда) и вызывает процедуру, определенную в ядре.
  2. Когда подпрограмма вызывается, она может решить установить сегменты кода/данных и указатель стека на таковые из контекста другой программы, "переключатель контекста".

Таким образом, это казалось простым в концепции, но я знал, что детали будут намного сложнее. Я нашел несколько вещей в сети, но терминология сильно различается, и примеры, похоже, взяты из контекстов, которых у меня нет (например, из ядра Linux).

Однако способ установки таблиц дескрипторов выглядит так:

  1. Отправьте некоторые данные на PIC (outb и что-то еще), чтобы инициализировать его.
  2. Подготовьте в памяти таблицу прерываний с указателями функций на нужные вам подпрограммы, обращая внимание на то, чтобы эти функции могли быть обработчиками сигналов.
  3. Загрузите таблицу с помощью lidt.

Тем не менее, я не могу найти много информации о том, как конкретно это делать, или о том, правильно ли это. У кого-нибудь есть ресурсы для сбитого с толку автора ядра?


person rovaughn    schedule 29.04.2012    source источник
comment
Интересный вопрос, вот классное сообщество: osdever.net Не то, чтобы он прямо отвечает на ваш вопрос, но есть немного полезной информации там.   -  person Austin Henley    schedule 29.04.2012
comment
Еще лучшее сообщество (с форумом и вики, а также своего рода связанным irc-каналом — #osdev @ irc.freenode.net) можно найти на osdev.org.   -  person Griwes    schedule 29.04.2012


Ответы (1)


Когда ваш компьютер загружается, BIOS программирует PIC таким образом, что IRQ0-IRQ15 привязаны к int 8 через int 0Fh и от int 70h до int 77h. Это нормально для режима реального адреса, в котором работает BIOS и работает MSDOS.

Но вам нужно изменить это сопоставление при переключении в защищенный режим, потому что некоторые важные исключения относятся к int 8 через int 0Fh (в первую очередь, #GP, #SS, #PF). Вы хотите этого, потому что хотите иметь возможность легко различать эти исключения и аппаратные прерывания, поступающие от таймера и часов реального времени, клавиатуры и мыши, дисков и портов ввода-вывода (последовательных и параллельных).

Это, вероятно, первый шаг, который вы наметили. Итак, поищите в Интернете «переназначение прерываний PIC» или что-то в этом роде. Кроме того, загрузите некоторые спецификации для чипа 8259 (PIC), чтобы иметь лучшее представление о том, что вы делаете и как он на самом деле работает. «HelpPC» — это старый добрый справочник, содержащий некоторую информацию о различном аппаратном обеспечении ПК.

Есть также «PCGPE» (Энциклопедия программирования игр для ПК) и «RBIL» (Список прерываний Ральфа Брауна), которые могут очень помочь.

Настройка IVT/IDT описана в документации по ЦП Intel и AMD. Это все есть. Не самое приятное чтение, зато самое подробное и авторитетное.

Существует множество веб-сайтов любителей самодельных ОС и тому подобного, где вы можете найти более подробную информацию и фрагменты кода.

person Alexey Frunze    schedule 29.04.2012
comment
Я видел какой-то код переназначения, плавающий раньше. Итак, я могу неправильно понять детали защищенного и реального режима, но, насколько я понимаю, ядро ​​​​работает в реальном режиме, но может переключаться в защищенный режим при запуске пользовательской программы. Однако разве он не переключается в реальный режим при переключении контекста? Это делается прерыванием, верно? Нужно ли переназначать прерывания только один раз перед запуском защищенной программы? - person rovaughn; 29.04.2012
comment
Обычно если и происходит переключение с реального на защищенное, то это делается только один раз, очень рано, при запуске ядра. - person Alexey Frunze; 30.04.2012