72 lines
1.4 KiB
C++
72 lines
1.4 KiB
C++
#include "gdt.h"
|
|
|
|
gdt_entry gdt[] = {
|
|
(gdt_entry){ // Null Segment
|
|
.limit_lo = 0,
|
|
.base_lo = 0,
|
|
.base_mid = 0,
|
|
.accessed = 0,
|
|
.read_write = 0,
|
|
.direction = 0,
|
|
.executable = 0,
|
|
.system_segment = 0,
|
|
.privilege = 0,
|
|
.present = 0,
|
|
.limit_hi = 0,
|
|
.__ignored__ = 0,
|
|
.size = 0,
|
|
.granularity = 0,
|
|
.base_hi = 0,
|
|
},
|
|
(gdt_entry){ // Code Segment
|
|
.limit_lo = 0xffff,
|
|
.base_lo = 0,
|
|
.base_mid = 0,
|
|
.accessed = 0,
|
|
.read_write = 1,
|
|
.direction = 0,
|
|
.executable = 1,
|
|
.system_segment = 1,
|
|
.privilege = 0,
|
|
.present = 1,
|
|
.limit_hi = 0xf,
|
|
.__ignored__ = 0,
|
|
.size = 1,
|
|
.granularity = 1,
|
|
.base_hi = 0
|
|
},
|
|
(gdt_entry){ // Data Segment
|
|
.limit_lo = 0xffff,
|
|
.base_lo = 0,
|
|
.base_mid = 0,
|
|
.accessed = 0,
|
|
.read_write = 1,
|
|
.direction = 0,
|
|
.executable = 0,
|
|
.system_segment = 1,
|
|
.privilege = 0,
|
|
.present = 1,
|
|
.limit_hi = 0xf,
|
|
.__ignored__ = 0,
|
|
.size = 1,
|
|
.granularity = 1,
|
|
.base_hi = 0
|
|
}
|
|
};
|
|
|
|
gdt_descr descr = (gdt_descr){
|
|
.size = sizeof(gdt) - 1,
|
|
.offset = gdt,
|
|
};
|
|
|
|
__attribute__((far)) void far_call() {}
|
|
|
|
void init_gdt() {
|
|
asm volatile("lgdt %0;"
|
|
"mov $0x10, %%eax;"
|
|
"mov %%eax, %%ss;"
|
|
"mov $0x10, %%eax;"
|
|
"mov %%eax, %%ds" : : "m" (descr));
|
|
|
|
far_call();
|
|
} |