Struct x86_64::structures::gdt::GlobalDescriptorTable
source · pub struct GlobalDescriptorTable { /* private fields */ }
Expand description
A 64-bit mode global descriptor table (GDT).
In 64-bit mode, segmentation is not supported. The GDT is used nonetheless, for example for switching between user and kernel mode or for loading a TSS.
The GDT has a fixed size of 8 entries, trying to add more entries will panic.
You do not need to add a null segment descriptor yourself - this is already done internally.
Data segment registers in ring 0 can be loaded with the null segment selector. When running in
ring 3, the ss
register must point to a valid data segment which can be obtained through the
Descriptor::user_data_segment()
function. Code segments must
be valid and non-null at all times and can be obtained through the
Descriptor::kernel_code_segment()
and
Descriptor::user_code_segment()
in rings 0 and 3
respectively.
For more info, see:
x86 Instruction Reference for mov
,
Intel Manual,
AMD Manual
Example
use x86_64::structures::gdt::{GlobalDescriptorTable, Descriptor};
let mut gdt = GlobalDescriptorTable::new();
gdt.add_entry(Descriptor::kernel_code_segment());
gdt.add_entry(Descriptor::user_code_segment());
gdt.add_entry(Descriptor::user_data_segment());
// Add entry for TSS, call gdt.load() then update segment registers
Implementations§
source§impl GlobalDescriptorTable
impl GlobalDescriptorTable
sourcepub const fn new() -> GlobalDescriptorTable
pub const fn new() -> GlobalDescriptorTable
Creates an empty GDT.
sourcepub const unsafe fn from_raw_slice(slice: &[u64]) -> GlobalDescriptorTable
pub const unsafe fn from_raw_slice(slice: &[u64]) -> GlobalDescriptorTable
Forms a GDT from a slice of u64
.
Safety
- The user must make sure that the entries are well formed
- The provided slice must not be larger than 8 items (only up to the first 8 will be observed.)
sourcepub fn as_raw_slice(&self) -> &[u64]
pub fn as_raw_slice(&self) -> &[u64]
Get a reference to the internal table.
The resulting slice may contain system descriptors, which span two u64
s.
sourcepub const fn add_entry(&mut self, entry: Descriptor) -> SegmentSelector
pub const fn add_entry(&mut self, entry: Descriptor) -> SegmentSelector
Adds the given segment descriptor to the GDT, returning the segment selector.
Panics if the GDT doesn’t have enough free entries to hold the Descriptor.
sourcepub fn load(&'static self)
pub fn load(&'static self)
Loads the GDT in the CPU using the lgdt
instruction. This does not alter any of the
segment registers; you must (re)load them yourself using the appropriate
functions:
SS::set_reg()
and CS::set_reg()
.
sourcepub unsafe fn load_unsafe(&self)
pub unsafe fn load_unsafe(&self)
Loads the GDT in the CPU using the lgdt
instruction. This does not alter any of the
segment registers; you must (re)load them yourself using the appropriate
functions:
SS::set_reg()
and CS::set_reg()
.
Safety
Unlike load
this function will not impose a static lifetime constraint
this means its up to the user to ensure that there will be no modifications
after loading and that the GDT will live for as long as it’s loaded.
Trait Implementations§
source§impl Clone for GlobalDescriptorTable
impl Clone for GlobalDescriptorTable
source§fn clone(&self) -> GlobalDescriptorTable
fn clone(&self) -> GlobalDescriptorTable
1.0.0§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read more