136 lines
4.1 KiB
Markdown
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;
|
|
> }
|
|
>```
|
|
|