
Describes the structure of segment descriptors. More...
#include <machine/gdt.h>
Public Member Functions | |
constexpr | SegmentDescriptor (uint64_t val=0) |
!< Merged value; useful for debugging More... | |
constexpr | SegmentDescriptor (uintptr_t base, uint32_t limit, bool code, int ring, Mode mode) |
Constructor for a 16/32 bit code/memory GDT entry. More... | |
Public Attributes | |
struct { | |
uint64_t | limit_low: 16 |
Least-significant bits of segment size (influenced by granularity!) | |
uint64_t | base_low: 24 |
Least-significant bits of base address. | |
uint64_t | type: 3 |
Meaning of those 3 bits depends on segment_type below. | |
enum Type | segment_type: 2 |
Segment type (influences the meaning of the 3 bits above) | |
uint64_t | privilege_level: 2 |
Ring for this segment. | |
bool | present: 1 |
Entry is valid iff set to 1. | |
uint64_t | limit_high: 4 |
Most-significant bits of segment size. | |
bool | available: 1 |
One bit to use for other purposes. | |
uint64_t | custom: 2 |
Meaning of those 2 bits depends on segment_type below. | |
Granularity | granularity: 1 |
Unit used as granularity for the segment limit. | |
uint64_t | base_high: 8 |
most-significant bits of base address | |
}; | |
struct { | |
uint64_t | __pad0__: 40 |
Ignored. | |
bool | code_accessed: 1 |
If set, the code segment was used since the last reset of this value. | |
bool | readable: 1 |
If set the code is readable (otherwise only executable) | |
bool | conforming: 1 |
If set, the execution of code from this segment is only allowed when running at a privilege of numerically less than or equal to privilege_level (i.e. the executor has the same or higher privileges). However, the executor's privileges remain unchanged. For nonconforming code segments (i.e., conforming is set to 0), execution is allowed only if the privileges are equal. Execution will cause a GPF in case of privilege violation. | |
uint64_t | __pad1__: 10 |
Ignored. | |
bool | is64bit: 1 |
64bit code segment More... | |
Size | operation_size: 1 |
Default address width. | |
uint64_t | __pad2__: 0 |
Remainder ignored. | |
}; | |
Fields specific for Code Segment. More... | |
struct { | |
uint64_t | __pad0__: 40 |
Ignored. | |
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. | |
uint64_t | __pad1__: 10 |
Ignored. | |
uint64_t | reserved: 1 |
Reserved, always set to 0! | |
Size | big: 1 |
Size of the stack pointer. More... | |
uint64_t | __pad2__: 0 |
Remainder ignored. | |
}; | |
Fields specific for Data Segment. More... | |
struct { | |
uint64_t | __pad0__: 40 |
Ignored. | |
enum Gate | gate: 3 |
TSS or LDT entry. | |
uint64_t | __pad1__: 0 |
Remainder ignored. | |
}; | |
Fields specific to the Task State Segment. More... | |
struct { | |
uint64_t | base64_high: 32 |
Most-significant part of 64bit TSS entries. | |
uint64_t | __pad0__: 8 |
Reserved. | |
uint64_t | zero: 5 |
Zero. | |
uint64_t | __pad1__: 0 |
Remainder ignored. | |
}; | |
Fields specific to the second part of the Task State Segment on x64. More... | |
uint64_t | value |
Describes the structure of segment descriptors.
A data structure that contains size, position, access rights, and purpose of any segment. Segment descriptors are used in both the GDT, as well as in LDTs.
|
inline |
!< Merged value; useful for debugging
Constructor for a specific value
|
inline |
Constructor for a 16/32 bit code/memory GDT entry.
base | Base Address |
limit | Size |
code | Code or data segment |
ring | Privilege level |
mode | Operation mode (real/protected/long) |
struct { ... } |
Fields specific for Code Segment.
struct { ... } |
Fields specific for Data Segment.
struct { ... } |
Fields specific to the Task State Segment.
struct { ... } |
Fields specific to the second part of the Task State Segment on x64.