Pull to refresh

Разработка ОС — часть 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:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.