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

source

pub const fn new() -> GlobalDescriptorTable

Creates an empty GDT.

source

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.)
source

pub fn as_raw_slice(&self) -> &[u64]

Get a reference to the internal table.

The resulting slice may contain system descriptors, which span two u64s.

source

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.

source

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

source

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

source§

fn clone(&self) -> GlobalDescriptorTable

Returns a copy of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for GlobalDescriptorTable

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl RefUnwindSafe for GlobalDescriptorTable

§

impl Send for GlobalDescriptorTable

§

impl Sync for GlobalDescriptorTable

§

impl Unpin for GlobalDescriptorTable

§

impl UnwindSafe for GlobalDescriptorTable

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.