Приветствую всех Трешбоксеров!
Наверное, каждый сталкивался с вопросом: «Как работает ОС, как она устроена и как делается?» Давайте разбираться на деле. В этой серии постов мы рассмотрим:
1) Как создается ОС?
2) Какие системы бывают?
3) Реализация своей ОС.
В этом посте мы рассмотрим вопросы об ОС и напишем шаблон для загрузчика. Как говорил Юрий Гагарин: «Поехали!»
1. Как создается ОС?
ИТАК, начнем с самого термина.
ОС (Операционная Система) — это программное обеспечение для управления компьютером и его оборудованием (так называемым «железом»).
ОС создается в несколько этапов:
1) Написание загрузчика
2) Написание ядра
3) Написание драйверов
4) Написание прикладных программ.
Здесь был бы еще и 5-ый пункт — написание своей графической оболочки — но он не особо у нас приветствуется, так как ОС могут использовать TUI (Text User Interface, он же «консольный интерфейс»), так и GUI (Graphical User Interface, он же «графический интерфейс»). Но поскольку в этой серии постов мы будем писать ОС с TUI, у нас GUI особо приветствоваться не будет, вдобавок работа с графикой это ОЧЕНЬ трудно.
2. Какие системы бывают?
Систем на самом деле довольно много в наше время. В наше время ОС делятся на несколько типов:
1) Микроядерные
2) Модульные
3) Гибридные
4) Unix-подобные
5) Монолитные
Названия ОС говорят сами за себя, от типа их ядра.
3. Реализация своей ОС.
Теперь самое вкусное — реализация своей ОС.
В этом посте мы просто напишем шаблон загрузчика, ничего более. Мы ЧИСТО для примера это напишем.
Итак, загрузчик является программой, запускаемой первой после запуска компьютера, поиска подписи 0xAA55 в диске через BIOS. Загрузчик часто пишут на ассемблере, но мы будем писать на C, потому что он имеет рпзные плюшки, которых нет в ассемблере.
Итак, давайте покажу простой пример для загрузчика:
```c
asm(".code16\n");
asm(«jmpl $0x0000, $_start»);
void _start()
{
for(;;);
}
```
Многие сейчас бы полетели в комментарии со словами, по типу: «Это че за фигня?!», " Боже, Господи, что за треш?!"; если бы не объяснил батька, что это все значит)
Короче, функция asm() является встроенной функцией в компиляторе для использования ассемблера (в моем случае GNU Assembler, так как компилирую я загрузчик через GCC).
asm(".code16\n"); — данная строчка означает установку битности режима. В нашем случае, это 16-битный реальный режим. Он от слова ОЧЕНЬ ограниченный, но при помощи его как то умудрялись же Microsoft или IBM делать свои DOS-системы?
asm(«jmpl $0x0000, $_start»); - переход к входной точке в программу, в нашем случае, это функция _start().
И сама функция _start() — входная точка в загрузчик.
for(;;); — указание на бесконечный цикл.
Теперь переходим к линковке. Да, без этого никак. Для линковки я использую GNU ld. Для нашей линковки напигем такой скрипт:
```linkerscript
OUTPUT_FORMAT(«binary»);
ENTRY(_start);
SECTIONS {
. = 0x7C00;
.entry: AT(0x7C00)
{
*(.text);
}
.sig: AT(0x7DFE)
{
SHORT(0xAA55);
}
}
```
Итак, данный скрипт задает формат файла(бинарный), точку входа(функция _start), и задает поля, необходимые для загрузчика.
Теперь к командам компиляции и линковки:
gcc -march=i686 -m16 -c -g -Os -nostdlib -nostdinc -ffreestanding boot.c -o boot.o
ld -T linker.ld -o boot.bin -n -nostdlib boot.o
Выходным получится файл boot.bin, его можно прошить в файл дискеты и запустить.
Что же, на этом все. Спасибо, кто дочитал! До следующих статей, пока! :)
Боюсь после пары постов, те кто действительно захотят преисполнится, будут плохо спать и мало есть.
Но идею полностью поддерживаю 👍