StuBS
GDT Namespace Reference

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

Classes

struct  SegmentDescriptor.__unnamed23__
 Fields specific for Data Segment (for debugging purposes) 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

Class Documentation

◆ GDT::SegmentDescriptor.__unnamed23__

struct GDT::SegmentDescriptor.__unnamed23__

Fields specific for Data Segment (for debugging purposes)

See also
ISDMv3, 3.4.5.1; Code- and Data-Segment Descriptor Types
Class Members
uint64_t __pad0__: 40 Ignored (set via limit_low and base_low)
bool data_accessed: 1 If set, the data segment was used since the last reset of this value.
bool writeable: 1 If set, data is writable (otherwise read only)
bool expand_down: 1 Growing direction for dynamically growing segments.
bool notData: 1 Has to be cleared (false)
uint64_t __pad1__: 9 Ignored (set via privilege_level ... available)
uint64_t reserved: 1 Reserved, always set to 0!
bool big: 1 Size of the stack pointer (false = 16 bit, true = 32 bit)
Warning
Has a different meaning in case expand_down is set to 1.
uint64_t __pad2__: 0 Remainder ignored.

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()

constexpr Pointer GDT::gdt_protected_mode_pointer ( protected_mode  )
constexpr

◆ gdt_long_mode_pointer()

constexpr 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 },
}
@ 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_DATA },
}
@ SIZE_64BIT_CODE
64-bit (D/B = 0, L = 1)
Definition gdt.h:49