mirror of
https://github.com/cfenollosa/os-tutorial.git
synced 2024-10-27 20:34:19 +00:00
lesson 23, steps 1 and 2
This commit is contained in:
parent
0134c5625c
commit
92ff191c3d
@ -7,8 +7,7 @@ OBJ = ${C_SOURCES:.c=.o cpu/interrupt.o}
|
|||||||
CC = /usr/local/i386elfgcc/bin/i386-elf-gcc
|
CC = /usr/local/i386elfgcc/bin/i386-elf-gcc
|
||||||
GDB = /usr/local/i386elfgcc/bin/i386-elf-gdb
|
GDB = /usr/local/i386elfgcc/bin/i386-elf-gdb
|
||||||
# -g: Use debugging symbols in gcc
|
# -g: Use debugging symbols in gcc
|
||||||
CFLAGS = -g -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs \
|
CFLAGS = -g -ffreestanding -Wall -Wextra -fno-exceptions
|
||||||
-Wall -Wextra -Werror
|
|
||||||
|
|
||||||
# First rule is run by default
|
# First rule is run by default
|
||||||
os-image.bin: boot/bootsect.bin kernel.bin
|
os-image.bin: boot/bootsect.bin kernel.bin
|
||||||
|
@ -7,4 +7,50 @@ JamesM's tutorial](http://wiki.osdev.org/James_Molloy%27s_Tutorial_Known_Bugs).
|
|||||||
Since we followed his tutorial for lessons 18-22 (interrupts through malloc), we'll
|
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.
|
need to make sure we fix any of the issues before moving on.
|
||||||
|
|
||||||
|
1. 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`
|
||||||
|
|
||||||
|
|
||||||
|
2. Not setting a stack
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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`.
|
||||||
|
|
||||||
|
4. Reinvented datatypes
|
||||||
|
-----------------------
|
||||||
|
<stddef.h> to provide size\_t
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5. Missing functions
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
6. Interrupt handlers
|
||||||
|
---------------------
|
||||||
|
- also cli, sti in interrupt handlers
|
||||||
|
|
||||||
|
|
||||||
|
7. Structs and attributes
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
8. Improperly aligned `kmalloc`
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
|
global _start;
|
||||||
[bits 32]
|
[bits 32]
|
||||||
[extern main] ; Define calling point. Must have same name as kernel.c 'main' function
|
|
||||||
call main ; Calls the C function. The linker will know where it is placed in memory
|
_start:
|
||||||
|
[extern kernel_main] ; Define calling point. Must have same name as kernel.c 'main' function
|
||||||
|
call kernel_main ; Calls the C function. The linker will know where it is placed in memory
|
||||||
jmp $
|
jmp $
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "../libc/string.h"
|
#include "../libc/string.h"
|
||||||
#include "../libc/mem.h"
|
#include "../libc/mem.h"
|
||||||
|
|
||||||
void main() {
|
void kernel_main() {
|
||||||
isr_install();
|
isr_install();
|
||||||
irq_install();
|
irq_install();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user