Setting up custom gdt after paging is enabled...
Posted: Sun Mar 20, 2005 11:57 am
Hello guys !
After kernel 0xc0000000 linking epsiod, I've enabled paging, mapping the first 4Mb as identity and at 0xc0000000. (I use grub to boot, and without trying to define my proper gdt, it seems to work well)
Since my gdt worked well before trying to test 0xc0000000 kernel linking (before, I was in identity mapping mode), I wouldn't think this can pose a problem !
Well, here is what bochs tells me :
Does someone know where this error comes from ?
thanks.
After kernel 0xc0000000 linking epsiod, I've enabled paging, mapping the first 4Mb as identity and at 0xc0000000. (I use grub to boot, and without trying to define my proper gdt, it seems to work well)
Since my gdt worked well before trying to test 0xc0000000 kernel linking (before, I was in identity mapping mode), I wouldn't think this can pose a problem !
Well, here is what bochs tells me :
And here is the code :00003641152e[CPU ] load_seg_reg: GDT: DS: index(0002) > limit(000000)
00003641152e[CPU ] exception(): 3rd (13) exception with no resolution, shutdown
Code: Select all
.text
...
; just after paging is enabled
lgdt [gdt_ptr]
mov ax,KERNEL_DATA_SEL
mov ds,ax
mov es,ax
mov ss,ax
mov fs,ax
mov gs,ax
jmp KERNEL_CODE_SEL:.continue
.continue :
...
.data
gdt:
; NULL descriptor
dw 0 ; limit 15:0
dw 0 ; base 15:0
db 0 ; base 23:16
db 0 ; type
db 0 ; limit 19:16, flags
db 0 ; base 31:24
KERNEL_CODE_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 9Ah ; present,ring 0,code,non-conforming,readable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
KERNEL_DATA_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 92h ; present, ring 0, data, expand-up, writable
db 0CFh ; page-granular (4 gig limit), 32-bit
db 0
USER_CODE_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 0FAh ; present,ring 3,code,non-conforming,readable
db 0DFh ; page-granular (4 gig limit), 32-bit
db 0
USER_DATA_SEL equ $-gdt
dw 0FFFFh
dw 0
db 0
db 0F2h ; present, ring 3, data, expand-up, writable
db 0DFh ; page-granular (4 gig limit), 32-bit
db 0
; unused descriptor
dw 0
dw 0
db 0
db 0
db 0
db 0
gdt_end:
gdt_ptr:
dw gdt_end - gdt - 1
dd (gdt - 0xc0000000 + 0x100000)
...
thanks.