MOS es el sistema operativo similar a UNIX desarrollado desde cero y tiene como objetivo cumplir con POSIX.
? Características opcionales
Macosa
Instalar paquetes
$ brew install qemu nasm gdb i386-elf-gcc i386-elf-grub bochs e2fsprogs xorriso
Abra su configuración Bash y agregue líneas a continuación. Dependiendo de su configuración Bash, el archivo puede ser diferente. Yo uso ohmyzsh , así que es .zshrc
# .zshrc
alias grub-file=i386-elf-grub-file
alias grub-mkrescue=i386-elf-grub-mkrescue
emulador de ejecución
$ cd src && mkdir logs
$ ./create_image.sh && ./build.sh qemu iso
Abrir otra terminal
$ cd src
$ gdb isodir/boot/mos.bin
# in gdb
(gdb) target remote localhost:1234
(gdb) c
✍? Si recibe este error hdiutil: attach failed - no mountable file systems , la instalación de extfs para Mac podría ayudar
Ubuntu
Instalar Packakges
$ sudo apt install build-essential autopoint bison gperf texi2html texinfo qemu automake-1.15 nasm xorriso qemu-system-i386Instale el compilador cruzado GCC a través de https://wiki.osdev.org/gcc_cross-compiler#the_build
Instale GCC (versión 9.1.0) y binutils (versión 2.32).
Abra SRC/Toolchain/Build.sh y modifique las variables de Sysroot and Prefijo para que se ajusten en su caso
PREFIX="$HOME/opt/cross"
TARGET=i386-pc-mos
# SYSROOT cannot locate inside PREFIX
SYSROOT="$HOME/Projects/mos/src/toolchain/sysroot"
JOBCOUNT=$(nproc)
Instalar MOS Toolchain
$ cd src/toolchain
$ ./build.sh
Emulador de ejecución
$ cd src && mkdir logs
$ ./create_image.sh
$ cd ports/figlet && ./package.sh && cd ../..
$ cd ports/bash && ./package.sh make && cd ../..
$ cd ports/coreutils && ./package.sh make && cd ../..
$ ./build.sh qemu iso
Abrir otra terminal
$ cd src
$ gdb isodir/boot/mos.bin
# in gdb
(gdb) target remote localhost:1234
(gdb) c
✍️ para obtener la dirección del espacio de usuario para la depuración
$ 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
Prueba unitaria
$ cd test && git clone https://github.com/ThrowTheSwitch/Unity.git unity
$ make clean && make
Depuración
en build.sh , agregando -s -S justo después de qemu para cambiar al modo de depuración. Actualmente, uso VScode + Native Depug -> Haga clic en Ejecutar -> Elija "Adjuntar a Qemu"
Escucha
Por defecto, MOS registra la salida al terminal. Si desea monitorear a través del archivo, haciendo los siguientes pasos
# src/build.sh#L71
-serial stdio
↓
-serial file:logs/uart1.log
$ tail -f serial.log | while read line ; do echo $line ; done
✍? El uso de tail en la tubería para colorear la salida (como arriba) hace un retraso -> tener que ahorrar manualmente en el IDE para obtener los últimos cambios