- Notifications
You must be signed in to change notification settings - Fork29
A hobby operating system developed from scratch
License
MQuy/mos
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
mOS is the UNIX-like operating system developed from scratch and aims to be POSIX compliant.
- Filesystem
- Program loading
- UI (X11)
- Log
- Networking
- Signal
- Terminal
- mOS toolchain
- Port figlet
- Libc
- Port GNU Bash, Coreutils
- Unit testing
- Dynamic linker
- Port GCC (the GNU Compiler Collection)
- Browser
- Sound
- Symmetric multiprocessing
🍀 Optional features
- Setup 2-level paging in boot.asm
MacOS
install packages
$ brew install qemu nasm gdb i386-elf-gcc i386-elf-grub bochs e2fsprogs xorriso
open your bash config and add lines below. Depending on your bash config, the file might be different. I use
ohmyzsh
, so it is.zshrc
# .zshrcalias grub-file=i386-elf-grub-filealias grub-mkrescue=i386-elf-grub-mkrescue
run emulator
$ cd src && mkdir logs$ ./create_image.sh && ./build.sh qemu iso
open another terminal
$ cd src$ gdb isodir/boot/mos.bin# in gdb(gdb) target remote localhost:1234(gdb) c
✍🏻 If you get this errorhdiutil: attach failed - no mountable file systems
, installingextFS for MAC might help
Ubuntu
Install packakges
$ sudo apt install build-essential autopoint bison gperf texi2html texinfo qemu automake-1.15 nasm xorriso qemu-system-i386
Install gcc cross compilier viahttps://wiki.osdev.org/GCC_Cross-Compiler#The_Build
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 PREFIXSYSROOT="$HOME/Projects/mos/src/toolchain/sysroot"JOBCOUNT=$(nproc)
Install mos toolchain
$ cd src/toolchain$ ./build.sh
Run Emulator
$ 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
Open another terminal
$ 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
Debugging
inbuild.sh
, adding-s -S
right afterqemu
to switch to debug mode. Currently, I use vscode +native debug -> click Run -> choose "Attach to QEMU"
Monitoring
by default, mOS logs output 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
✍🏻 Usingtail
in pipe way to color the output (like above) causes a delay -> have to manually save in the IDE to get latest changes