Go into 32bits protected mode
This commit is contained in:
parent
868278ffec
commit
a6750cb2a5
70
mbr.asm
70
mbr.asm
@ -70,5 +70,75 @@ boot:
|
||||
call println
|
||||
add sp, 2
|
||||
|
||||
; Switch in 32bits Protected mode
|
||||
|
||||
; Activate A20 http://wiki.osdev.org/A20_Line to be able to access more than 1Mb memory
|
||||
mov ah, 0h
|
||||
mov ax, 0x2401
|
||||
int 0x15
|
||||
|
||||
; Change video mode to display VGA
|
||||
mov ax, 0x3
|
||||
int 0x10
|
||||
|
||||
|
||||
cli ; clear interruption flag
|
||||
|
||||
; switch in 32 bits
|
||||
lgdt [gdt_pointer] ; switch in 32bits here
|
||||
mov eax, cr0
|
||||
or eax,0x1; set the protected mode bit on special CPU reg cr0
|
||||
mov cr0, eax
|
||||
jmp CODE_SEG:boot2
|
||||
|
||||
; GDT table desciption could be found http://wiki.osdev.org/Global_Descriptor_Table
|
||||
; here we define the 3 64bits segment needed: null segment, code segment and data segment
|
||||
gdt_start: ;null segment
|
||||
dq 0x0
|
||||
gdt_code: ;code segment
|
||||
dw 0xFFFF
|
||||
dw 0x0
|
||||
db 0x0
|
||||
db 10011010b
|
||||
db 11001111b
|
||||
db 0x0
|
||||
gdt_data:
|
||||
dw 0xFFFF
|
||||
dw 0x0
|
||||
db 0x0
|
||||
db 10010010b
|
||||
db 11001111b
|
||||
db 0x0
|
||||
gdt_end:
|
||||
gdt_pointer:
|
||||
dw gdt_end - gdt_start
|
||||
dd gdt_start
|
||||
|
||||
CODE_SEG equ gdt_code - gdt_start
|
||||
DATA_SEG equ gdt_data - gdt_start
|
||||
|
||||
bits 32
|
||||
boot2:
|
||||
mov ax, DATA_SEG
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov fs, ax
|
||||
mov gs, ax
|
||||
mov ss, ax
|
||||
mov esi,hello32
|
||||
mov ebx,0xb8000 ; Cannot use BIOS anymore, use VGA Text buffer instead
|
||||
|
||||
.loop32:
|
||||
lodsb
|
||||
or al,al
|
||||
jz halt
|
||||
or eax,0x0100 ; blue bg
|
||||
mov word [ebx], ax
|
||||
add ebx,2
|
||||
jmp .loop32
|
||||
halt:
|
||||
cli
|
||||
hlt
|
||||
hello32: db "Hello world!",0
|
||||
times 510 - ($ - $$) db 0 ; fill up to 510 with 0
|
||||
dw 0xAA55 ; MBR magic number
|
||||
|
Loading…
Reference in New Issue
Block a user