No description
  • C 97.6%
  • Assembly 1.1%
  • Shell 1%
  • Makefile 0.3%
Find a file
Minh Quy 8327ee4f13
Merge pull request #13 from bsd86/master
Fixed some inconsistencies/typos
2021-10-11 08:11:15 +02:00
.vscode Implement mkdir, mkdirat and add syscall 2020-12-07 22:30:33 +01:00
examples Implement poll and wake queue system 2020-08-13 23:01:38 +02:00
src Update install instructions 2021-03-04 01:10:44 +01:00
test Setup test using ceedling 2020-11-10 19:44:54 +01:00
tools Setup log format based on lnav 2020-11-25 22:17:14 +01:00
.gitignore Libc: Implement getenv, setenv, putenv and unsetenv 2020-11-10 02:36:52 +01:00
C17.md Add newline in end of source file note for C17 and correct grammar in ebooks/podcasts notes 2021-06-27 10:45:04 +02:00
Expert C Programming.md Add C runtime note 2021-06-27 23:13:57 +02:00
K&R.md Add newline in end of source file note for C17 and correct grammar in ebooks/podcasts notes 2021-06-27 10:45:04 +02:00
LICENSE Add MIT License 2020-03-27 14:11:39 +01:00
OS.md Add newline in end of source file note for C17 and correct grammar in ebooks/podcasts notes 2021-06-27 10:45:04 +02:00
Podcast.md Add newline in end of source file note for C17 and correct grammar in ebooks/podcasts notes 2021-06-27 10:45:04 +02:00
project.yml Setup test using ceedling 2020-11-10 19:44:54 +01:00
README.md Update README.md 2021-10-10 20:01:29 -04:00

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