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
|
||||
|
||||
## 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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user