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

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

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

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

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

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

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

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

13
задан rovaughn 29 April 2012 в 15:50
поделиться