gdt.asm (989B)
1 default rel 2 global load_gdt 3 4 gdt_start: 5 6 gdt_null: 7 dq 0 8 9 gdt_kernel_code: 10 dw 0xffff 11 dw 0 12 db 0 13 db 10011011b 14 db 10101111b 15 db 0 16 17 gdt_kernel_data: 18 dw 0xffff 19 dw 0 20 db 0 21 db 10010011b 22 db 11001111b 23 db 0 24 25 gdt_user_code: 26 dw 0xffff 27 dw 0 28 db 0 29 db 11111011b 30 db 10101111b 31 db 0 32 33 gdt_user_data: 34 dw 0xffff 35 dw 0 36 db 0 37 db 11110011b 38 db 11001111b 39 db 0 40 41 gdt_end: 42 43 44 K_CODE_SEG equ gdt_kernel_code - gdt_start 45 K_DATA_SEG equ gdt_kernel_data - gdt_start 46 U_CODE_SEG equ gdt_user_code - gdt_start 47 U_DATA_SEG equ gdt_user_data - gdt_start 48 49 [bits 64] 50 default rel 51 52 section .data 53 align 16 54 gdtr: 55 dw 0 ; Limit 56 dq 0 57 58 section .text 59 global load_gdt 60 load_gdt: 61 cli 62 mov [rel gdtr], di 63 mov [rel gdtr+2], rsi 64 lgdt [rel gdtr] 65 66 push 0x08 67 lea RAX, [rel .reload_CS] 68 push RAX 69 retfq 70 71 .reload_CS: 72 MOV AX, 0x10 73 MOV DS, AX 74 MOV ES, AX 75 MOV FS, AX 76 MOV GS, AX 77 MOV SS, AX 78 RET