Это самый первый пост в серии туториалов по созданию крошечной ОС.
Для начала, нам нужен кросс-компилятор. Для этих постов я выбрал связку из GNU GCC 4.8.2 и GNU Binutils 2.24.
Среда
Сначала, загрузим всё необходимое.
Далее, когда есть 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:
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 ; вечный цикл
Вот, и пожалуй, всё. До встречи в следующей части!