Skip to content

glolichen/lios

Repository files navigation

LiOS

An experimental x86_64 operating system written from scratch in C.

Currently Implemented

  • Bootstrapping to long mode
  • Interrupts (only keyboard implemented)
  • Printing to VGA graphical mode and serial
  • Minimum viable memory manager/allocator
    • Uses paging (obviously)
    • Linked list based page frame and virtual address allocator
    • Kernel heap allocator (using linked lists and bitmap)
  • Supports UEFI and runs on real hardware
  • Basic file system functionality:
    • reading and writing from NVMe SSD volume
    • Only FAT32 file system
    • Can read and create new files, but not write data
  • Basic ELF/program loading functionality

To Do

Goals:

  1. Load ELF programs (probably no shared objects, no C library, but need to create a basic syscall ABI)
  2. Processes
  3. Userspace shell program

Backburner:

  • Find a way to not read the entire FAT when doing anything with one file
  • Virtual address allocator can only use 1 4KiB page, which is only 128 linked list nodes. So if the memory gets too fragmented the allocator will completely break.
  • Implement writing to a file, beyond simply creating new files

Memory Layout

Sort of based on Linux, with other self-imposed janks as well.

  • 0xFFFFFFFF80000000-0xFFFFFFFFFFFFFFFF (highest 2GiB) is directly mapped to the first 2GiB of physical memory. Paging structures, and also DMA structures sometime in the future, are stored here. Used for kmalloc
  • 0xFFFFF00000000000-0xFFFFFFFF80000000 are used for other pieces of kernel memory. Used for vmalloc. Page frames used by vmalloc come from physical memory above the 2GiB mark. User page frames also come from there.
  • 0xFFFF800000000000-??? reserved for VGA frame buffer virtual address.
  • 0xFFFF900000000000-??? are used to temporarily map PCI device configuration spaces when looking for NVMe drives, and is then used to map the NVMe device for future use.
  • Lower-half virtual memory for user processes.

Sources

write bootable usb: sudo dd if=iso/os.iso of=/dev/sda create qemu drive: qemu-img create -f raw disk.img [size] and create GPT with cfdisk disk.img

Dependencies

LiOS depends on GNU-EFI for parsing EFI information. Clone https://git.code.sf.net/p/gnu-efi/code to the base directory and to the folder gnu-efi.

About

Questionably written operating system

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published