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
## 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
## Mapping Pages

View File

@@ -165,22 +165,25 @@ impl Table {
let entry_address = self.0.start_address() + index * ENTRY_SIZE;
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)]
struct TableEntry(u64);
impl TableEntry {
fn is_unused(&self) -> bool {
self.0 == 0
fn ununsed() -> TableEntry {
TableEntry(0)
}
fn set_unused(&mut self) {
self.0 = 0
}
fn set(&mut self, frame: Frame, flags: TableEntryFlags) {
self.0 = (((frame.number as u64) << 12) & 0x000fffff_fffff000) | flags.bits();
fn new(frame: Frame, flags: TableEntryFlags) -> TableEntry {
let frame_addr = (frame.number << 12) & 0x000fffff_fffff000;
TableEntry((frame_addr as u64) | flags.bits())
}
fn flags(&self) -> TableEntryFlags {