Создание ОС: Часть I (Загрузчик)

Приветствую всех Трешбоксеров!

Наверное, каждый сталкивался с вопросом: «Как работает ОС, как она устроена и как делается?» Давайте разбираться на деле. В этой серии постов мы рассмотрим:

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, его можно прошить в файл дискеты и запустить.

Что же, на этом все. Спасибо, кто дочитал! До следующих статей, пока! :)

Читайте на 123ru.net