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

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

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

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

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

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

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

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

Ответы

Ответ 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" (список прерываний Ralf Brown), которые могут многое помочь.

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

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

Ответ 2

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

  • Учебник по разработке ядра JamesM поможет вам в разработке очень простого ядра, которое это охватывает. Вы захотите обратить особое внимание на главы 4 и 5. Он поставляется с полным кодом.
  • OSDev.org Справочный материал. Содержит всю необходимую техническую информацию. Более подробный и точный, чем учебник.

Если вы действительно хотите понять этот материал, я предлагаю вам прочитать статьи в OSDev, чтобы попытаться написать все сами. Начните с загрузки, вывода экрана, обработки pic и irq. Используйте учебник, если вы застряли.