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