StuBS
GDT Namespace Reference

Abstracts the GDT that, primarily, contains descriptors to memory segments. More...

Classes

union  SegmentDescriptor
 Describes the structure of segment descriptors. More...

Structs

struct  Pointer
 Structure that describes a GDT Pointer (aka GDT Descriptor). More...

Enumerations

enum  Segments {
  SEGMENT_NULL = 0 ,
  SEGMENT_KERNEL_CODE ,
  SEGMENT_KERNEL_DATA
}
enum  Granularity {
  GRANULARITY_BYTES = 0 ,
  GRANULARITY_4KBLOCK = 1
}
 Unit of the segment limit. More...
enum  DescriptorType {
  DESCRIPTOR_SYSTEM = 0 ,
  DESCRIPTOR_CODEDATA = 1
}
 Descriptor type. More...
enum  Size {
  SIZE_16BIT = 0 ,
  SIZE_32BIT = 2 ,
  SIZE_64BIT_CODE = 1 ,
  SIZE_64BIT_DATA = 0
}
 Address width. More...

Functions

constexpr Pointer gdt_protected_mode_pointer (protected_mode)
constexpr Pointer gdt_long_mode_pointer (long_mode)

Constants

static SegmentDescriptor protected_mode []
static SegmentDescriptor long_mode []

Detailed Description

Abstracts the GDT that, primarily, contains descriptors to memory segments.

The GDT is a table that primarily contains segment descriptors. Segment descriptors has a size of 8 Bytes and contains the size, position, access rights, and purpose of such a segment. Unlike the LDT, the GDT is shared between all processes and may contain TSS and LDT descriptors. For the kernel, the first entry is required to be a null descriptor and the code and data segments. To support user-mode processes, additional TSS, code, and data segments for ring 3 must be added.

The base address and size of the GDT are written to the GDTR register during boot (via. lgdt).

See also
ISDMv3, 2.4.1; Global Descriptor Table Register (GDTR)
ISDMv3, 3.5.1; Segment Descriptor Tables

Enumeration Type Documentation

◆ Segments

Enumerator
SEGMENT_NULL 
SEGMENT_KERNEL_CODE 
SEGMENT_KERNEL_DATA 

◆ Granularity

Unit of the segment limit.

Enumerator
GRANULARITY_BYTES 

Segment limit in Bytes.

GRANULARITY_4KBLOCK 

Segment limit in blocks of 4 Kilobytes.

◆ DescriptorType

Descriptor type.

Enumerator
DESCRIPTOR_SYSTEM 

entry is a system segment

DESCRIPTOR_CODEDATA 

entry is a code/data segment

◆ Size

enum GDT::Size

Address width.

Enumerator
SIZE_16BIT 

16-bit (D/B = 0, L = 0)

SIZE_32BIT 

32-bit (D/B = 1, L = 0)

SIZE_64BIT_CODE 

64-bit (D/B = 0, L = 1)

SIZE_64BIT_DATA 

64-bit (D/B = 0, L = 0)

Function Documentation

◆ gdt_protected_mode_pointer()

Pointer GDT::gdt_protected_mode_pointer ( protected_mode )
constexpr

◆ gdt_long_mode_pointer()

Pointer GDT::gdt_long_mode_pointer ( long_mode )
constexpr

Constant Documentation

◆ protected_mode

SegmentDescriptor GDT::protected_mode[]
static
Initial value:
= {
{},
{ 0x0,
0xFFFFFFFF,
true,
0,
{ 0x0,
0xFFFFFFFF,
false,
0,
}
@ SIZE_32BIT
32-bit (D/B = 1, L = 0)
Definition gdt.h:48

◆ long_mode

SegmentDescriptor GDT::long_mode[]
static
Initial value:
= {
{},
{ 0x0,
0x0,
true,
0,
{ 0x0,
0x0,
false,
0,
}
@ SIZE_64BIT_CODE
64-bit (D/B = 0, L = 1)
Definition gdt.h:49
@ SIZE_64BIT_DATA
64-bit (D/B = 0, L = 0)
Definition gdt.h:50