Урок 1. Настройка окружения.

Нам нужен фундамент на котором мы начнем создание нашей ОС. Во-первых, предполагается что Вы используется *nix систему с набором утилит GNU. Под windows Вы можете использовать Cygwin, однако тогда написание сценариев сборки полностью на Вашей совести. Также у Вас должен быть установлен загрузчик GRUB2 и должна работать команда grub2-mkrescue.

 

1.1. Структура каталога

У меня структура каталога следующая:
gOWNOS
 |
 +-- src
 |
 +-- docs
Все Ваши файлы с исходными кодами помещаются в каталога src, а вся документация (Вы же собираетесь писать документацию!?) помещается в каталог docs.

 

1.2. Компиляция

Примеры, приводимые в данном цикле статей, должны прекрасно компилироваться с набором утилит GNU (gcc,ld,gas и т.д.). Примеры исходных кодов на языке ассемблера написаны с использованием Intel синтаксиса. Для ассемблирования этих файлов Вам потребуется Netwide Assembler (Вообще я поклонник синтаксиса AT&T, но поддамся в данном случае мнению большинства).

Этот цикл статей не описывает вопросы написания загрузчика. В качестве загрузчика мы будем использовать GRUB2. Далее будет описано как при помощи GRUB2 создать ISO образ загрузочного диска для запуска нашей ОС.

 

1.3. Запуск

Для запуска и тестирования ОС Вам не обязательно иметь под рукой свободную машину. Вы можете использовать любой эмулятор по своему усмотрению. Примеры должны хорошо работать на VirtualBox и QEMU.

 

1.4. Вспомогательные скрипты

Некоторые действия, такие как сборка ядра и создание загрузочного диска, нам придется повторять очень часто. Автоматизируем эти процессы.

 

1.4.1. Makefile

# Original file taken from JamesM's tutorials
# The C and C++ rules are already setup by default.
# The only one that needs is the assembler 
# as we use nasm instead of GNU as

OBJS=boot.o

CFLAGS=
LDFLAGS=-Tlink.ld
ASFLAGS=-felf

all: $(OBJS) link

clean:
    -rm *.o kernel

link:
    ld $(LDFLAGS) -o kernel $(OBJS)

.s.o:
    nasm $(ASFLAGS) $<

Makefile скомпилирует каждый файл в OBJS, затем слинкует их вместе в ELF-формате. В качестве скрипта линковки используется link.ld.

 

1.4.2. Link.ld

/* Link.ld -- Linker script for the kernel - ensure everything goes in the */
/*            Correct place */
/*            Original file taken from Bran's Kernel Development */
/*            tutorials: http://www.osdever.net/bkerndev/index.php */

ENTRY(start)
SECTIONS
{
    .text 0x100000 :
    {
        code = .; _code = .; __code = .;
        *(.text)
        . = ALIGN(4096);
    }

    .data :
    {
        data = .; _data = .; __data = .;
        *(.data)
        *(.rodata)
        . = ALIGN(4096);
    }

    .bss :
    {
        bss = .; _bss = .; __bss = .;
        *(.bss)
        . = ALIGN(4096)
    }

    end = .; _end = .; __end = .;
}

Этот скрипт сообщает линковщику как настроить наше ядро. В начале он сообщает линковщику, что точкой входа в нашем исполняемом файле будет адрес с меткой 'start'. Затем он сообщает линковщику, что секция .text (в ней располагается весь наш код) должна располагаться первой и начнаться с адреса 0x100000 (1 МБ). Секции .data (содержащая инициализированные статические переменные) и .bss (содержащая неинициализированные статические переменные) должны располагаться следом, и быть выравнены по границе страницы (ALIGN(4096)). GCC также добавляет специальную секцию .rodata, в которой располагаются инициализированные данные предназначенные только для чтения, например константы. Для простоты просто совместим эту секцию с секцией .data.

UPD

1.5. Образ

Пример создания образа для ВМ Qemu и VirtualBox описан в соответствующем How-To. Если нет желания разбираться, то можно поступить проще: скачать подготовленный образ по ссылке http://github.com/downloads/Interfere/gOWNOS/gownos_hdd.img.

Для записи ядра необходимо примонтировать образ:
~# mount -o loop,offset=1048576 gownos_hdd.img /mnt/image
и скопировать ядро:
~# cp kernel /mnt/image/boot/kernel-gownos

Не забудьте отмонтировать образ перед запуском ВМ. Для изменения настроек загрузчика просто отредактируйте файл grub.conf находящийся на образе.


Код уже на github.
В следующий раз мы начнем писать код ядра.

Комментариев нет:

Отправить комментарий