Add section about modifying table entries

This commit is contained in:
Philipp Oppermann
2015-11-30 12:43:00 +01:00
parent 882af6f14e
commit 907f51bb5b
2 changed files with 35 additions and 8 deletions

View File

@@ -266,6 +266,30 @@ pub fn translate(virtual_address: usize) -> Option<PhysicalAddress> {
TODO TODO
## Modifying Entries
To modify page table entries, we add a `set_entry` function to `Table`:
```rust
fn set_entry(&mut self, index: usize, value: TableEntry) {
assert!(index < ENTRY_COUNT);
let entry_address = self.0.start_address() + index * ENTRY_SIZE;
unsafe { *(entry_address as *mut _) = value }
}
```
And to create new entries, we add some `TableEntry` constructors:
```rust
fn ununsed() -> TableEntry {
TableEntry(0)
}
fn new(frame: Frame, flags: TableEntryFlags) -> TableEntry {
let frame_addr = (frame.number << 12) & 0x000fffff_fffff000;
TableEntry((frame_addr as u64) | flags.bits())
}
```
## Switching Page Tables ## Switching Page Tables
## Mapping Pages ## Mapping Pages

View File

@@ -165,22 +165,25 @@ impl Table {
let entry_address = self.0.start_address() + index * ENTRY_SIZE; let entry_address = self.0.start_address() + index * ENTRY_SIZE;
unsafe { *(entry_address as *const _) } unsafe { *(entry_address as *const _) }
} }
fn set_entry(&mut self, index: usize, value: TableEntry) {
assert!(index < ENTRY_COUNT);
let entry_address = self.0.start_address() + index * ENTRY_SIZE;
unsafe { *(entry_address as *mut _) = value }
}
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]
struct TableEntry(u64); struct TableEntry(u64);
impl TableEntry { impl TableEntry {
fn is_unused(&self) -> bool { fn ununsed() -> TableEntry {
self.0 == 0 TableEntry(0)
} }
fn set_unused(&mut self) { fn new(frame: Frame, flags: TableEntryFlags) -> TableEntry {
self.0 = 0 let frame_addr = (frame.number << 12) & 0x000fffff_fffff000;
} TableEntry((frame_addr as u64) | flags.bits())
fn set(&mut self, frame: Frame, flags: TableEntryFlags) {
self.0 = (((frame.number as u64) << 12) & 0x000fffff_fffff000) | flags.bits();
} }
fn flags(&self) -> TableEntryFlags { fn flags(&self) -> TableEntryFlags {