Я пишу небольшое ядро только для того, чтобы немного разобраться с низкоуровневыми вещами. Прямо сейчас он загружается в Virtual Box, и я могу отображать текст на экране, выделять немного памяти и выполнять другие действительно простые вещи. Он написан на C++ и немного на ассемблере.
Одной из вещей, которую я хотел изучить, был механизм, лежащий в основе многозадачности. Насколько я понимаю, это происходит примерно так:
- Ядро инициализирует таблицу дескрипторов прерываний, так что прерывание выдается периодически (например, миллисекунда) и вызывает процедуру, определенную в ядре.
- Когда подпрограмма вызывается, она может решить установить сегменты кода/данных и указатель стека на таковые из контекста другой программы, "переключатель контекста".
Таким образом, это казалось простым в концепции, но я знал, что детали будут намного сложнее. Я нашел несколько вещей в сети, но терминология сильно различается, и примеры, похоже, взяты из контекстов, которых у меня нет (например, из ядра Linux).
Однако способ установки таблиц дескрипторов выглядит так:
- Отправьте некоторые данные на PIC (
outb
и что-то еще), чтобы инициализировать его. - Подготовьте в памяти таблицу прерываний с указателями функций на нужные вам подпрограммы, обращая внимание на то, чтобы эти функции могли быть обработчиками сигналов.
- Загрузите таблицу с помощью
lidt
.
Тем не менее, я не могу найти много информации о том, как конкретно это делать, или о том, правильно ли это. У кого-нибудь есть ресурсы для сбитого с толку автора ядра?