Updated GDT code

This commit is contained in:
Alex 2022-11-05 06:31:45 +02:00
parent 6d15a42e17
commit 8e579133cc
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
2 changed files with 95 additions and 6 deletions

View File

@ -8,12 +8,67 @@
namespace GlobalDescriptorTable namespace GlobalDescriptorTable
{ {
static GlobalDescriptorTableEntries GDTEntries = { static GlobalDescriptorTableEntries GDTEntries = {
{.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b00000000, .Flags = 0b00000000, .BaseHigh = 0x00}, // null // null
{.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b10011010, .Flags = 0b00100000, .BaseHigh = 0x00}, // kernel code {.Length = 0x0,
{.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b10010010, .Flags = 0b00000000, .BaseHigh = 0x00}, // kernel data .BaseLow = 0x0,
{.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b11111010, .Flags = 0b00100000, .BaseHigh = 0x00}, // user code .BaseMiddle = 0x0,
{.Length = 0x0000, .BaseLow = 0x0000, .BaseMiddle = 0x00, .Access = 0b11110010, .Flags = 0b00000000, .BaseHigh = 0x00}, // user data .Access = 0b00000000,
{.Length = 0, .Low = 0, .Middle = 0, .Flags1 = 0b10001001, .Flags2 = 0b00000000, .High = 0, .Upper32 = 0, .Reserved = 0}}; // tss .Flags = 0b00000000,
.BaseHigh = 0x0},
// kernel code
{.Length = 0x0,
.BaseLow = 0x0,
.BaseMiddle = 0x0,
.Access = RING0 |
CODE_READABLE |
CODE_SEGMENT |
PRESENT,
.Flags = _64BITS,
.BaseHigh = 0x0},
// kernel data
{.Length = 0x0,
.BaseLow = 0x0,
.BaseMiddle = 0x0,
.Access = RING0 |
DATA_WRITEABLE |
DATA_SEGMENT |
PRESENT,
.Flags = 0b00000000,
.BaseHigh = 0x0},
// user code
{.Length = 0x0,
.BaseLow = 0x0,
.BaseMiddle = 0x0,
.Access = CODE_READABLE |
CODE_SEGMENT |
RING3 |
PRESENT,
.Flags = _64BITS,
.BaseHigh = 0x0},
// user data
{.Length = 0x0,
.BaseLow = 0x0,
.BaseMiddle = 0x0,
.Access = DATA_WRITEABLE |
DATA_SEGMENT |
RING3 |
PRESENT,
.Flags = 0b00000000,
.BaseHigh = 0x0},
// tss
{.Length = 0x0,
.Low = 0x0,
.Middle = 0x0,
.Flags1 = 0b10001001,
.Flags2 = 0b00000000,
.High = 0x0,
.Upper32 = 0x0,
.Reserved = 0x0}};
GlobalDescriptorTableDescriptor gdt = {.Length = sizeof(GlobalDescriptorTableEntries) - 1, .Entries = &GDTEntries}; GlobalDescriptorTableDescriptor gdt = {.Length = sizeof(GlobalDescriptorTableEntries) - 1, .Entries = &GDTEntries};

View File

@ -5,6 +5,40 @@
namespace GlobalDescriptorTable namespace GlobalDescriptorTable
{ {
/* https://github.com/nanobyte-dev/nanobyte_os/blob/master/src/kernel/arch/i686/gdt.c */
/* https://wiki.osdev.org/Global_Descriptor_Table */
typedef enum
{
CODE_READABLE = 0b00000010,
DATA_WRITEABLE = 0b00000010,
CODE_CONFORMING = 0b00000100,
DATA_DIRECTION_NORMAL = 0b00000000,
DATA_DIRECTION_DOWN = 0b00000100,
DATA_SEGMENT = 0b00010000,
CODE_SEGMENT = 0b00011000,
DESCRIPTOR_TSS = 0b00000000,
RING0 = 0b00000000,
RING1 = 0b00100000,
RING2 = 0b01000000,
RING3 = 0b01100000,
PRESENT = 0b10000000
} AccessFlags;
typedef enum
{
_64BITS = 0b00100000,
_32BITS = 0b01000000,
_16BITS = 0b00000000,
GRANULARITY_1B = 0b00000000,
GRANULARITY_4K = 0b10000000
} GDTFlags;
typedef struct _TaskStateSegmentEntry typedef struct _TaskStateSegmentEntry
{ {
uint16_t Length; uint16_t Length;