# KFS (Kernel From Scratch) This project aims to explore how a kernel works by building our own, gaining hands-on experience with core concepts like memory management, interrupt, keyboard driver, etc ## INSTALLATION ### Cross compile the compile [THE DOCUMENTATION](https://wiki.osdev.org/GCC_Cross-Compiler) - install requirement follow [THE DOCUMENTATION](https://wiki.osdev.org/GCC_Cross-Compiler) - Setup the shell ``` sh export PREFIX="$HOME/opt/cross" export TARGET=i386-elf export PATH="$PREFIX/bin:$PATH" mkdir $HOME/src cd $HOME/src ``` - Download [binutils](https://ftp.gnu.org/gnu/binutils/?C=M;O=D) - Download [gcc](https://ftp.gnu.org/gnu/gcc/?C=M;O=D) - Download [gdb](https://ftp.gnu.org/gnu/gdb/?C=M;O=D) - extract archives ``` sh tar xf [your binutils archive] tar xf [your gcc archive] tar xf [your gdb archive] ``` - (protips use -j [nb core]) - Compile binutils ``` sh cd $HOME/src mkdir build-binutils cd build-binutils ../binutils-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror make make install ``` - Compile gdb ``` sh cd $HOME/src mkdir build-gdb cd build-gdb ../gdb.x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-werror make all-gdb make install-gdb make make install ``` - Compile gcc ``` sh cd $HOME/src # The $PREFIX/bin dir _must_ be in the PATH. We did that above. which -- $TARGET-as || echo $TARGET-as is not in the PATH mkdir build-gcc cd build-gcc ../gcc-x.y.z/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 ``` ### Compile and the start the kernel ``` sh make run ```