From 164e7734b32e42dd4468962507b3cbb98123357c Mon Sep 17 00:00:00 2001 From: Daniel Hammer Date: Tue, 11 Mar 2025 20:12:12 +0100 Subject: [PATCH] feat(readme): revamp readme --- README.md | 41 ++++++++++++++++++++++------------------- images/OS220.png | Bin 0 -> 48070 bytes kernel/src/Main.cpp | 2 ++ 3 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 images/OS220.png diff --git a/README.md b/README.md index 878078e..bc249a4 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,26 @@ # OS220 -Research kernel in C++ +Research project aiming to create a modern kernel and operating system in C++ -### Implemented (kernel) -- Global Descriptor Table -- Output via Flanterm by mintsuki -- Memory map scanning -- Kernel-mode heap allocator +![OS220 handling a page fault exception in the kernel](https://i.imgur.com/P0Qz350.png) -### In progress (kernel) -- ISR handling (interrupts) -- Virtual memory paging -- UEFI runtime service support -- ACPI & AML support +### Kernel +- [x] Global Descriptor Table +- [x] Output via Flanterm by mintsuki +- [x] Memory map scanning +- [-] Kernel-mode heap allocator +- [ ] ISR handling (interrupts) +- [ ] Virtual memory paging +- [ ] UEFI runtime service support +- [ ] ACPI & AML support +- [ ] PCI-e +- [ ] HPET timer +- [ ] Object manager +- [ ] Ramdisk +- [ ] Scheduler -### Implemented (kernel C++ library) -- new/delete operators via kernel heap -- String stream (`cstringstream`) -- Console output stream (`kout`, `kerr`) - -### In progress (kernel C++ library) -- Vector/array class -- String class \ No newline at end of file +### Kernel C++ library +- [x] new/delete operators +- [x] String stream (`cstringstream`) +- [x] Console output stream via `operator<<` (`kout`, `kerr`) +- [x] Vector/array class +- [ ] String class \ No newline at end of file diff --git a/images/OS220.png b/images/OS220.png new file mode 100644 index 0000000000000000000000000000000000000000..fc719d1209faec5ab12f1ce92254f6b5752d29f4 GIT binary patch literal 48070 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 ); + kout << "OS220 research kernel project" << "\n" << "Written by Daniel Hammer" << "\n" << "\n"; + #if defined (__x86_64__) Hal::PrepareGDT(); Hal::BridgeLoadGDT();