> [!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; > } >```