Разработка ОС — часть 1. Кросс-компилятор и GRUB Multiboot

Это самый первый пост в серии туториалов по созданию крошечной ОС.


Для начала, нам нужен кросс-компилятор. Для этих постов я выбрал связку из GNU GCC 4.8.2 и GNU Binutils 2.24.


Среда


Сначала, загрузим всё необходимое.


Если у вас Windows, то...

Загрузите Cygwin с помощью этой ссылки:
32-бит или
64-бит


Далее, когда есть Unix-like среда, нужно установить некоторые пакеты:


  • GCC и G++
  • GNU Make
  • Bison
  • Flex
  • GMP
  • MPC
  • MPFR
  • Texinfo
  • NASM (для компиляции нашего первого куска ОС)
  • QEMU (умеет запускать plain Multiboot kernels)

Это можно сделать так:
Cygwin: Cygwin Setup
Ubuntu или Debian: sudo apt-get install имя-пакета
Gentoo: sudo emerge --ask имя-пакета
Fedora: sudo dnf install имя-пакета
И, наконец, OpenBSD: doas pkg_add имя-пакета


Ок, предположим, всё это есть у нас. Теперь самый "сложный" шаг: компиляция Binutils и GCC, именно в таком порядке.


Сначала скачиваем исходники в папку, например, $HOME/cross-src.


Binutils
GCC


И теперь сама компиляция.


Для начала, Binutils:


export PREFIX="$HOME/opt/cross" # Папка, где будут бинари.
export TARGET=i686-elf # У нас будет i686 процессор, и компилятор генерирует ELF файлы.
export PATH="$PREFIX/bin:$PATH"

cd $HOME/cross-src # Папка с сорсами для Binutils & GCC.
mkdir build-binutils
cd build-binutils
../binutils-2.24/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
make
make install

Теперь мы можем построить GCC.


Там, по сути, будет почти то же:


export PREFIX="$HOME/opt/cross" # Папка, где будут бинари.
export TARGET=i686-elf # У нас будет i686 процессор, и компилятор генерирует ELF файлы.
export PATH="$PREFIX/bin:$PATH"

cd $HOME/src

which -- $TARGET-as || echo $TARGET-as is not in the PATH

mkdir build-gcc
cd build-gcc
../gcc-4.8.2/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --without-headers
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc

Теперь, наконец то, можно писать саму ОС!


Сначала, Multiboot header:


.set ALIGN, 1<<0
.set MEMINFO, 1<<1
.set FLAGS, ALIGN | MEMINFO
.set MAGIC, 0x1BADB002
.set CHECKSUM, -(MAGIC + FLAGS)
section .multiboot
align 4
    dd MAGIC
    dd FLAGS
    dd CHECKSUM

И сам код для "ОС".


mov eax, 0xCAFEBABE
loop:
jmp loop ; вечный цикл

Вот, и пожалуй, всё. До встречи в следующей части!

Tags:
osdev

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.