Files
FoundryOS/docs/Planning & To-Dos.md

136 lines
4.1 KiB
Markdown

> [!todo] Testing
> - [ ] setup custom test frameworks (Use CrystalOS-V2 as a reference)
> - [ ] write a sub-crate for tests
> - [ ] implement several unit tests on things that we are likely to break often
> - [ ] setup Git CI/CD pipeline with testing
> - [ ] figure out how to run QEMU in the test environment
> - [ ] write a script to run tests
> - [ ] a release should only be published if all tests pass
> [!todo] Memory
> - [ ] make sure page tables are correct. we're still getting the annoying page fault errors for the APIC
> - [ ] page allocator
> - [ ] e
> [!todo] Allocator
> - [x] learn about several allocator designs and decide on the optimal one
> - [x] implementation
> - [x] implement an allocate method
> - [x] implement a deallocate method
> - [x] set the global allocator
> - [ ] testing
> - [ ] write unit tests
> - [ ] many allocations
> - [ ] large allocations
> - [ ] allocating more memory than is available
> - [ ] pass unit tests
> [!todo] Threading
> - [ ] implement thread switching functionality
> - [ ] switch stacks
> - [ ] implement multi-threading
> - [ ] figure out how to turn on another core
> - [ ] Scheduler
> - [ ] which task goes on which thread?
> - [ ] round robin / time slicing algorithm
> - [ ] switch tasks on a given core
> - [ ] push registers
> - [ ] switch stacks
> - [ ] ensure the scheduler knows where to find the stack for each thread
> - [ ] move a given task to a new core
> - [ ] differentiate between kernel threads and user threads
> - [ ] create syscall to create a new thread
> [!todo] Filesystem
> - [ ] AHCI Implementation
> - [ ] figure out what hard drives are attached
> - [ ] read data
> - [ ] write data
> - [ ] FAT32 Implementation
> - [ ] parse FAT header
> - [ ] figure out where files are / what files are what
> - [ ] parse file metadata / figure out type of file
> - [ ] reading the entirety of a file into memory
> - [ ] *(extension)* ext2 Implementation
> - [ ] Syscall API
> - [ ] provide a user program with file read / write access given a filename
> - [ ] translate a filename into a disk location of data & the size of the data
> - [ ] provide an interface to read from a file or write to a file
> [!todo] APIC
> - [ ] Enable APIC
> - [x] Get apic location from MSR
> - [x] Enable APIC bit flag
> - [x] Disable Legacy PIC
> - [ ] Map physical APIC address to virtual memory
>
>> [!error]
>> Page fault exception occurs when APIC is activated
>
>- [ ] Setup Interrupt handlers to handle interrupts generated by the APIC
> - [ ] Timer Interrupts
> - [ ] Keyboard Interrupts
> [!todo] Userspace (req: Threading, Filesystem)
> - [ ] Load program into memory from disk
> - [ ] requires:
> - [ ] Program Loader
> - [ ] Parse ELF File
> - [ ] Load file into memory
> - [ ] Filesystem
> - [ ] Scheduler (to start and manage the process)
> - [ ] Start a user process
> - [ ] switch stacks
> - [ ] jump to user code
>[!todo] User Interface
>- This will be a library so that programs in userspace can provide a user interface rather than relying on text commands from a basic terminal
>- features required:
> - [ ] Rendering frames to a display buffer
> - [ ] requires: Frame rendering Syscall
> - [ ] I/O
> - [ ] syncio
> - [ ] keystrokes
> - [ ] asyncio
> - [ ] keystrokes
> - [ ] requires: I/O Syscalls
> - [ ] Window struct
> - [ ] stores it's size and location
> - [ ] handles rendering pixels to the screen
> - [ ] Widgets
> - [ ] textbox / label
> - [ ] single line text input
> - [ ] how do we capture keyboard inputs?
> - [ ] multiline text input
> - [ ] how do we capture keyboard inputs?
> - [ ] button
> - [ ] dialog
> - [ ] box widget
> - [ ] figure out how to nest other widgets inside it
>```rust
>pub struct Window {
> position;
> dimensions;
>}
>
>impl Window {
> fn display(&self, frame: &Frame) -> Result<(), RenderError>;
>}
>
>pub struct Frame<'a> {
> window: &'a Window,
> data: <"... a suitable type to store pixels">
>}
>
>impl<'a> Frame<'a> {
> pub fn display(&self) -> Result<(), RenderError> {
> self.window.display(self)
> }
>}
>
> pub trait Widget {
> fn render(&self) -> Frame;
> }
>```