mirror of
https://github.com/phil-opp/blog_os.git
synced 2025-12-16 22:37:49 +00:00
Add section about modifying table entries
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user