gdt.c (1913B)
1 #include <gdt.h> 2 3 static GDTEntry descriptors[5]; 4 static GDTPtr gdtptr; 5 6 void 7 gdt_reload() 8 { 9 asm volatile("lgdt %0\n\t" 10 "push $0x08\n\t" 11 "lea 1f(%%rip), %%rax\n\t" 12 "push %%rax\n\t" 13 "lretq\n\t" 14 "1:\n\t" 15 "mov $0x10, %%eax\n\t" 16 "mov %%eax, %%ds\n\t" 17 "mov %%eax, %%es\n\t" 18 "mov %%eax, %%fs\n\t" 19 "mov %%eax, %%gs\n\t" 20 "mov %%eax, %%ss\n\t" 21 : 22 : "m"(gdtptr) 23 : "rax", "memory"); 24 } 25 26 void 27 initGDT() 28 { 29 // null descriptor (0) 30 descriptors[0].limit_low = 0; 31 descriptors[0].base_low = 0; 32 descriptors[0].base_mid = 0; 33 descriptors[0].access = 0; 34 descriptors[0].limit_high_and_flags = 0; 35 descriptors[0].base_high = 0; 36 37 // kernel code 64 (40) 38 descriptors[1].limit_low = 0; 39 descriptors[1].base_low = 0; 40 descriptors[1].base_mid = 0; 41 descriptors[1].access = 0b10011010; 42 descriptors[1].limit_high_and_flags = 0b00101000; 43 descriptors[1].base_high = 0; 44 45 // kernel data 64 (48) 46 descriptors[2].limit_low = 0; 47 descriptors[2].base_low = 0; 48 descriptors[2].base_mid = 0; 49 descriptors[2].access = 0b10010010; 50 descriptors[2].limit_high_and_flags = 0; 51 descriptors[2].base_high = 0; 52 53 // user code 64 (72) 54 descriptors[3].limit_low = 0; 55 descriptors[3].base_low = 0; 56 descriptors[3].base_mid = 0; 57 descriptors[3].access = 0b11111010; 58 descriptors[3].limit_high_and_flags = 0b00101000; 59 descriptors[3].base_high = 0; 60 61 // user data 64. (80) 62 descriptors[4].limit_low = 0; 63 descriptors[4].base_low = 0; 64 descriptors[4].base_mid = 0; 65 descriptors[4].access = 0b11110010; 66 descriptors[4].limit_high_and_flags = 0; 67 descriptors[4].base_high = 0; 68 69 gdtptr.limit = sizeof(descriptors) - 1; 70 gdtptr.base = (uint64_t)&descriptors; 71 72 gdt_reload(); 73 }