mirror of
				https://github.com/cfenollosa/os-tutorial.git
				synced 2025-06-13 12:54:24 +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
 | 
			
		||||
GDB = /usr/local/i386elfgcc/bin/i386-elf-gdb
 | 
			
		||||
# -g: Use debugging symbols in gcc
 | 
			
		||||
CFLAGS = -g -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs \
 | 
			
		||||
		 -Wall -Wextra -Werror
 | 
			
		||||
CFLAGS = -g -ffreestanding -Wall -Wextra -fno-exceptions
 | 
			
		||||
 | 
			
		||||
# First rule is run by default
 | 
			
		||||
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
 | 
			
		||||
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]
 | 
			
		||||
[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
 | 
			
		||||
jmp $
 | 
			
		||||
 | 
			
		||||
_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 $
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@
 | 
			
		||||
#include "../libc/string.h"
 | 
			
		||||
#include "../libc/mem.h"
 | 
			
		||||
 | 
			
		||||
void main() {
 | 
			
		||||
void kernel_main() {
 | 
			
		||||
    isr_install();
 | 
			
		||||
    irq_install();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user