Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

MQuy/mos

Repository files navigation

mOS

license MIT By Vietnamese

mOS is the UNIX-like operating system developed from scratch and aims to be POSIX compliant.

Work-in-process features

  • 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

Get started

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

    # .zshrc
    alias grub-file=i386-elf-grub-file
    alias 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 error hdiutil: attach failed - no mountable file systems, installing extFS 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 via https://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 PREFIX
    SYSROOT="$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

in build.sh, adding -s -S right after qemu 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

✍🏻 Using tail in pipe way to color the output (like above) causes a delay -> have to manually save in the IDE to get latest changes

References

Tutorials

Ebooks

About

A hobby operating system developed from scratch

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

Languages

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /