unreal gdt now has 2 selectors 1 code, 1 data
ss, and e/f/g segments are loaded to the same flat 4gb segment moved gdt notes to documentation
This commit is contained in:
61
docs/gdt.txt
Normal file
61
docs/gdt.txt
Normal file
@@ -0,0 +1,61 @@
|
||||
GDT documentation below:
|
||||
|
||||
Pr: Present bit. This must be 1 for all valid selectors.
|
||||
|
||||
Privl: Privilege, 2 bits. Contains the ring level,
|
||||
0 = highest (kernel), 3 = lowest (user applications).
|
||||
|
||||
S: Descriptor type. This bit should be set for code or data segments
|
||||
and should be cleared for system segments (eg. a Task State Segment)
|
||||
|
||||
Ex: Executable bit. If 1 code in this segment can be executed
|
||||
ie. a code selector. If 0 it is a data selector.
|
||||
|
||||
DC: Direction bit/Conforming bit.
|
||||
Direction bit for data selectors: Tells the direction.
|
||||
0 the segment grows up. 1 the segment grows down, ie. the offset has to be greater than the limit.
|
||||
|
||||
Conforming bit for code selectors:
|
||||
If 1 code in this segment can be executed from an equal or lower privilege level.
|
||||
For example, code in ring 3 can far-jump to conforming code in a ring 2 segment.
|
||||
The privl-bits represent the highest privilege level that is allowed to execute the segment.
|
||||
For example, code in ring 0 cannot far-jump to a conforming code segment with privl==0x2
|
||||
while code in ring 2 and 3 can. Note that the privilege level remains the same
|
||||
ie. a far-jump form ring 3 to a privl==2-segment remains in ring 3 after the jump.
|
||||
|
||||
If 0 code in this segment can only be executed from the ring set in privl.
|
||||
|
||||
RW: Readable bit/Writable bit.
|
||||
Readable bit for code selectors: Whether read access for this segment is allowed. Write access is never allowed for code segments.
|
||||
Writable bit for data selectors: Whether write access for this segment is allowed. Read access is always allowed for data segments.
|
||||
|
||||
Ac: Accessed bit. Just set to 0. The CPU sets this to 1 when the segment is accessed.
|
||||
|
||||
Gr: Granularity bit. If 0 the limit is in 1 B blocks (byte granularity), if 1 the limit is in 4 KiB blocks (page granularity).
|
||||
|
||||
Sz: Size bit. If 0 the selector defines 16 bit protected mode. If 1 it defines 32 bit protected mode.
|
||||
You can have both 16 bit and 32 bit selectors at once.
|
||||
|
||||
AvL: Availible to software bit, the CPU does not use this field and software can read/write to it
|
||||
|
||||
D/B bit: The default operand-size bit is found in code-segment and data-segment descriptors but not in system-segment descriptors. Setting
|
||||
this bit to 1 indicates a 32-bit default operand size, and clearing it indicates a 16-bit default size.
|
||||
|
||||
E bit: Expand down bit: Setting this bit to 1 identifies the data segment as expand-down.
|
||||
In expand-down segments, the segment limit defines the lower segment boundary while the base is the upper boundary
|
||||
|
||||
A GDT entry is 8 bytes and is constructed as follows:
|
||||
First DWORD
|
||||
0-15 Limit 0:15 First 16 bits in the segment limiter
|
||||
16-31 Base 0:15 First 16 bits in the base address
|
||||
|
||||
2nd DWORD
|
||||
|
||||
0:7 Base 16:23 Bits 16-23 in the base address
|
||||
8:12 S/Type Segment type and attributes, S = bit 12, Type = 8:11, Type is either [1, DC, RW, Ac] <code> or [0, E, RW, Ac] <data>
|
||||
13:14 Privl 0 = Highest privilege (OS), 3 = Lowest privilege (User applications)
|
||||
15 Pr Set to 1 if segment is present
|
||||
16:19 Limit 16:19 Bits 16-19 in the segment limiter
|
||||
20:22 Attributes Different attributes, depending on the segment type
|
||||
23 Gr Used together with the limiter, to determine the size of the segment
|
||||
24:31 Base 24:31 The last 24-31 bits in the base address
|
||||
Reference in New Issue
Block a user