Added missing entrypoint and other files
This commit is contained in:
parent
1e7f6dd22e
commit
46a560910b
|
@ -0,0 +1,37 @@
|
||||||
|
; Definition of our Global Descriptor Table
|
||||||
|
|
||||||
|
gdt_start: ; The labels are important to compute the size of the GDT: don't touch them!
|
||||||
|
; The GDT starts with 8 null bytes
|
||||||
|
dd 0x0 ; 4 byte
|
||||||
|
dd 0x0 ; 4 byte
|
||||||
|
|
||||||
|
; GDT for code segment. base = 0x00000000, length = 0xfffff
|
||||||
|
; for flags, refer to os-dev.pdf document, page 36
|
||||||
|
gdt_code:
|
||||||
|
dw 0xffff ; segment length, bits 0-15
|
||||||
|
dw 0x0 ; segment base, bits 0-15
|
||||||
|
db 0x0 ; segment base, bits 16-23
|
||||||
|
db 10011010b ; flags (8 bits)
|
||||||
|
db 11001111b ; flags (4 bits) + segment length, bits 16-19
|
||||||
|
db 0x0 ; segment base, bits 24-31
|
||||||
|
|
||||||
|
; GDT for data segment. base and length identical to code segment
|
||||||
|
; some flags changed, again, refer to os-dev.pdf
|
||||||
|
gdt_data:
|
||||||
|
dw 0xffff
|
||||||
|
dw 0x0
|
||||||
|
db 0x0
|
||||||
|
db 10010010b
|
||||||
|
db 11001111b
|
||||||
|
db 0x0
|
||||||
|
|
||||||
|
gdt_end:
|
||||||
|
|
||||||
|
; GDT descriptor
|
||||||
|
gdt_descriptor:
|
||||||
|
dw gdt_end - gdt_start - 1 ; size (16 bit), always one less of its true size
|
||||||
|
dd gdt_start ; address (32 bit)
|
||||||
|
|
||||||
|
; define some constants for later use
|
||||||
|
CODE_SEG equ gdt_code - gdt_start
|
||||||
|
DATA_SEG equ gdt_data - gdt_start
|
|
@ -0,0 +1,25 @@
|
||||||
|
[bits 16]
|
||||||
|
switch_to_protected_mode:
|
||||||
|
cli ; We disable interrupts...
|
||||||
|
lgdt [gdt_descriptor] ; ... load the GDT descriptor...
|
||||||
|
mov eax, cr0
|
||||||
|
or eax, 0x1 ; ... set 32-bit mode in CR0
|
||||||
|
mov cr0, eax
|
||||||
|
jmp CODE_SEG:switch32 ; ... and perform a far jump using a different segment
|
||||||
|
|
||||||
|
|
||||||
|
[bits 32]
|
||||||
|
switch32: ; We're not in 32 bit mode, yay!
|
||||||
|
mov ax, DATA_SEG ; Time to update the segment registers with their new values
|
||||||
|
mov ds, ax
|
||||||
|
mov ss, ax
|
||||||
|
mov es, ax
|
||||||
|
; Bonus: we have two more user-defined
|
||||||
|
; segment registers when in 32-bit mode
|
||||||
|
mov fs, ax
|
||||||
|
mov gs, ax
|
||||||
|
|
||||||
|
mov ebp, 0x90000 ; We also move the stack further up
|
||||||
|
mov esp, ebp
|
||||||
|
|
||||||
|
call BEGIN_32BIT ; We call back into mbr.s which loads the kernel
|
|
@ -0,0 +1,4 @@
|
||||||
|
[bits 32]
|
||||||
|
[extern kmain]
|
||||||
|
call kmain
|
||||||
|
jmp $
|
Loading…
Reference in New Issue