A hobby operating system developed from scratch
mOS is the unix-like operating system developed from scratch and aims to POSIX compliant.
🍀 Optional features
MacOS
$ brew install qemu nasm gdb i386-elf-gcc i386-elf-grub bochs e2fsprogs xorriso
ohmyzsh, so it is
.zshrc
# .zshrc alias grub-file=i386-elf-grub-file alias grub-mkrescue=i386-elf-grub-mkrescue
$ cd src && mkdir logs $ ./create_image.sh && ./build.sh qemu iso
$ cd src $ gdb isodir/boot/mos.bin # in gdb (gdb) target remote localhost:1234 (gdb) c
✍🏻 If you get this error
hdiutil: attach failed - no mountable file systems, installing extFS for MAC might help
Ubuntu
Install gcc cross compilier via https://wiki.osdev.org/GCCCross-Compiler#TheBuild
Install GCC (Version 9.1.0) & Binutils (Version 2.32).
Open src/toolchain/build.sh and modify SYSROOT and PREFIX variables to fit in your case
PREFIX="$HOME/opt/cross" TARGET=i386-pc-mos # SYSROOT cannot locate inside PREFIX SYSROOT="$HOME/Projects/mos/src/toolchain/sysroot" JOBCOUNT=$(nproc)
$ cd src/toolchain $ ./build
$ cd src && mkdir logs $ ./create_image.sh $ cd src/ports/bash && ./package.sh $ cd src/ports/coreutils && ./package.sh $ ./build.sh qemu iso
$ cd src $ gdb isodir/boot/mos.bin # in gdb (gdb) target remote localhost:1234 (gdb) c
✍️ To get userspace address for debugging
$ i386-mos-readelf -e program # find the line below and copy Addr # [Nr] Name Type Addr Off Size ES Flg Lk Inf Al # [ x] .text PROGBITS xxx xxx xxx 00 AX 0 0 4
Unit Test
$ cd test && git clone https://github.com/ThrowTheSwitch/Unity.git unity $ make clean && make
Debuging
in
build.sh, adding
-s -Sright after
qemuto switch to debug mode. Currently, I use vscode + native debuge -> click Run -> choose "Attach to QEMU"
Monitoring
by default mOS log outputs to terminal. If you want to monitor via file, doing following steps
# src/build.sh#L71 -serial stdio ↓ -serial file:logs/uart1.log
$ tail -f serial.log | while read line ; do echo $line ; done
✍🏻 Using
tailin pipe way to color the output (like above) causes a delay -> have to manually saving in ide to get latest changes