I am writing a toy operating system. I am trying to implement memory protection for an operating system. All I want to do is create protection for the kernel from user space programs. I want to do this purely with segmentation and not paging.
Here is the GDT:
gdt_start:
dd 0x0 ; 4 byte
dd 0x0 ; 4 byte
gdt_code:
dw 0xfff7 ; segment length, bits 0-15
dw 0x0 ; segment base, bits 0-15
db 0x0 ; seg2ment 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_data:
dw 0xfff7
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
U_code:
dw 0xfff7 ; segment length, bits 0-15
dw 0x0008 ; segment base, bits 0-15
db 0x0 ; seg2ment base, bits 16-23
db 11111010b ; flags (8 bits)
db 11001111b ; flags (4 bits) + segment length, bits 16-19
db 0x0 ; segment base, bits 24-31
U_data:
dw 0xfff7
dw 0x0008
db 0x0
db 11110010b
db 11001111b
db 0x0
gdt_end:
U_data
and U_code
are going to be the user space (ring 3). When I am in kernel space (ring 0) and try switching data segments by executing:
mov ax, 0x20
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
I get a segmentation error (13).
What am I doing wrong? Any guidance would be greatly appreciated.