I have found that mixing 16 bits and 32bits codes in my kernel is really a nightmare.So I tried to enter PM in my Bootloader.
But I encountered some "interesting" problem:
This is my GDT:
Code: Select all
;;;;;;;;GDT Table Begin;;;;;;;;;;;;;;
fake_gdt:
fake_gdt_null:
dd 0
dd 0
fake_gdt_data_addr equ $- fake_gdt
fake_gdt_data:
dw 0xffff
dw 0
db 0
db 10010010b ;(7)seg exist,(6-5)privileg,(4)0:sys seg,1:data or code seg,(3-0)seg attr,2:data seg,read and write.
db 11001111b ;(7)limit len,0:1 byte,1:4K,(6)B bit,control stack,B=1,use esp,B=0,use sp,(5-4) reserved,(3-0)seg limit 19-16.
db 0
fake_gdt_code_addr equ $-fake_gdt
fake_gdt_code:
dw 0xffff
dw 0
db 0
db 10011010b ;(7)seg exist,(6-5)privileg,(4)0:sys seg,1:data or code seg,(3-0)seg attr,10:code seg,execute and read.
db 11001111b
db 0
fake_gdt_end:
fake_gdt_addr:
dw fake_gdt_end - fake_gdt - 1 ;gdt total length,here it contains 3 item
dd fake_gdt ;gdt start address
;;;;;;;;GDT Table End;;;;;;;;;;;;;;
Code: Select all
lgdt [fake_gdt_addr]
; Set PE bit
mov eax,cr0
or eax,1
mov cr0,eax
; enable A20 gate
in al, 92h
or al, 00000010b
out 92h, al
;set data segments
mov ax,8 ;ds selector
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
;jump to kenel,which loaded at 0x9000,in absolute address
jmp 0x10:0x9000 ;cs=0x10=10 000b
;===================================================================
Code: Select all
00000809157i[CPU0 ] MOV_EwSw: using of nonexisting segment register
00000809157e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00000809157i[SYS ] bx_pc_system_c::Reset(SOFTWARE) called
Anything wrong with my jump instruction?
I am really confused