| .. | ||
| boot | ||
| cpu | ||
| drivers | ||
| kernel | ||
| libc | ||
| Makefile | ||
| README.md | ||
Concepts you may want to Google beforehand: XX
Goal: Fix miscellaneous issues with our code
The OSDev wiki has a section which describes some issues with JamesM's tutorial. Since we followed his tutorial for lessons 18-22 (interrupts through malloc), we'll need to make sure we fix any of the issues before moving on.
- Wrong CFLAGS
We add -ffreestanding when compiling .o files, which includes kernel_entry.o and thus
kernel.bin and os-image.bin.
Before, we disabled libgcc (not libc) through the use of -nostdlib and we didn't re-enable
it for linking. Since this is tricky, we'll delete -nostdlib
-nostdinc was also pased to gcc, but we will need it for step 3.
- kernel.c
main()function
Modify kernel/kernel.c and change main() to kernel_main() since gcc recognizes "main" as
a special keyword and we don't want to mess with that.
Change boot/kernel_entry.asm to point to the new name accordingly.
To fix the i386-elf-ld: warning: cannot find entry symbol _start; defaulting to 0000000000001000
warning message, add a global _start; and define the _start: label in boot/kernel_entry.asm.
- Reinvented datatypes
It looks like it was a bad idea to define non-standard data types like u32 and such, since
C99 introduces standard fixed-width data types like uint32_t
We need to include <stdint.h> which works even in -ffreestanding (but requires stdlibs)
and use those data types instead of our own, then delete them on type.h
We also delete the underscores around __asm__ and __volatile__ since they aren't needed.
- Improperly aligned
kmalloc
First, since kmalloc uses a size parameter, we'll use the correct data type size_t instead
of u32int_t. size_t should be used for all parameters which "count" stuff and cannot be
negative. Include <stddef.h>.
We will fix our kmalloc in the future, making it a proper memory manager and aligning data types.
For now, it will always return a new page-aligned memory block.
- Missing functions
We will implement the missing mem* functions in following lessons
- Interrupt handlers
cli is redundant, since we already established on the IDT entries if interrupts
are enabled within a handler using the idt_gate_t flags.
sti is also redundant, as iret loads the eflags value from the stack, which contains a
bit telling whether interrupts are on or off.
In other words the interrupt handler automatically restores interrupts whether or not
interrupts were enabled before this interrupt
On cpu/isr.h, struct registers_t has a couple issues.
First, the alleged esp is renamed to useless.
The value is useless because it has to do with the current stack context, not what was interrupted.
Then, we rename useresp to esp
Finally, we add cld just before call isr_handler on cpu/interrupt.asm