1. Настройка окружения, создание загрузчика (Bootloader) и переход в защищенный режим
Настройка окружения, создание загрузчика (Bootloader) и переход в защищенный режим
Добро пожаловать на курс по разработке операционной системы. Мы начинаем погружение в низкоуровневое программирование, где нет привычных библиотек, сборщиков мусора и защиты от ошибок. Здесь вы управляете каждым байтом памяти и каждым тактом процессора.
В этой статье мы подготовим рабочий инструментарий, напишем наш первый загрузочный сектор на Assembler, разберем, как компьютер включается, и переведем процессор из реального режима (Real Mode) в защищенный режим (Protected Mode).
Инструментарий и настройка окружения
Для разработки ОС нам потребуется Linux. Это стандарт де-факто для системного программирования благодаря мощным утилитам командной строки. Если у вас Windows, рекомендую использовать WSL2 или виртуальную машину.
Нам понадобятся три главных инструмента:
Установка в Ubuntu/Debian:
Теория загрузки: BIOS и MBR
Когда вы нажимаете кнопку питания, происходит магия, называемая POST (Power-On Self-Test). После проверки железа BIOS (Basic Input/Output System) ищет загрузочное устройство. Как BIOS понимает, что диск является загрузочным?
Согласно техническим стандартам, BIOS считывает самый первый сектор диска (сектор 0). Размер сектора составляет ровно 512 байт. Если последние два байта этого сектора равны магическому числу 0xAA55, BIOS считает этот код загрузчиком, копирует его в оперативную память и передает ему управление.
> BIOS считывает носители на наличие загрузочной сигнатуры - слова 0х55АА по смещению 0x1FE. Если она присутствует, то первые 512 байт с носителя загружается в ОЗУ по адресу 0х7С00. > > habr.com
Адресация памяти в Реальном режиме (Real Mode)
При старте процессоры семейства x86 (даже самые современные Intel Core i9 или AMD Ryzen) работают в режиме совместимости с процессором 8086. Этот режим называется Real Mode.
В этом режиме процессор 16-битный. Это накладывает серьезные ограничения:
Чтобы получить физический адрес в памяти, процессор использует два значения: Сегмент и Смещение. Формула вычисления физического адреса выглядит так:
Где:
ds, cs), указывающее начало блока памяти.Например, если ds = 0x1000, а смещение bx = 0x0050, то физический адрес будет:
Где:
Пишем первый загрузчик
Создадим файл boot.asm. Наша задача — вывести текст на экран, используя прерывания BIOS, и бесконечно зациклить процессор.
> Современные загрузчики представляют собой сложные программы, способные загружать множество операционных систем различными способами. Я решил начать изучение с максимально простого подхода. > > habr.com
Теперь, скомпилировав этот код, вы увидите букву "P" в левом верхнем углу. Это означает, что процессор успешно перешел в защищенный режим и мы получили прямой доступ к памяти видеокарты.
Итоги
0x7C00, если находит сигнатуру 0xAA55 в конце первого сектора диска.CR0.