В этом разделе мы будем рассматривать загрузку ОС в 32-битном режиме protected mode.
В 16 битном режиме который называется real mode компьютер работает после включения. Доступная память для адресации это 1 Мегабайт 0xFFFFF, так как 20 двоичных бит вмещают число 1048575. 20 двоичных бит это размер шины адреса процессора 8086. 16 битным режим называется потому что регистры процессора используются 16 битные (ax, bx, cx, dx). Для использования всех ресурсов ПК требуется переход в 32 битный режим работы процессора, который называется protected mode. В 16 битном режиме используются регистры ax, bx, cx, dx. В 32 битном режиме используются расширенные регистры (extended) eax, ebx, ecx, edx. В чем смысл 32 битного режима. Можно один код положить в одну часть памяти - и назначить этому коду привилегию - например ядро ОС. Можно положить другой код (например пользовательскую программу) в другую часть памяти, и назначить ему привилегию - пользовательская программа. И таким образом пользовательская программа не сможет получить доступ к памяти где выполняется ядро ОС. Это предусмотрено в целях безопасности. Как происходит переключение в protected mode. Сначала на языке ассемблера нужно определить таблицу GDT Global Descriptor Table - в этой таблице содержится информация о сегменте кода и сегменте данных для программы которая будет выполняться. В этой таблице указывается привилегия для выполняемого кода - это пользовательская программа, или ядро ОС. Затем есть инструкция процессора lgdt которая выполняет загрузку адреса таблицы которую мы оформили в коде ассемблера GDT. Команда ассемблера расшифровывается как Load GDT. После выполнения команды процессора lgdt, необходимо переключить контрольный регист CR0. Все это делается в коде примера, который вы можете загружить ниже. Всю эту информацию более детально вы можете почитать в документе Chapter 4 - Entering 32-bit Protected Mode страница 30. Кроме того преимущество 32 битного режима работы процессора заключается в том, что вы можете написать программу на С++ (если она не использует библиотеки, т.е. если не надо писать в коде С++ например #include <stdio.h>), и выполнить эту скомпилированную программу после перехода загрузчика в 32 битный режим. Компилировать программу необходимо в чистый бинарный код. Недостатки 32 битного режима в том, что невозможно использовать прерывания BIOS, необходимо все свои обработчики для устройств писать самостоятельно. Например в 32 битном режиме нельзя использовать прерывание int 10h BIOS для вывода строки символов на экран. В 32 битном режиме для вывода строки символов необходимо записать символ прямо в видеопамять, по адресу 0xb8000.
Загрузить код примера можно ЗДЕСЬ.