diff --git a/posts/DRAFT-paging.md b/posts/DRAFT-paging.md index 5d4c0dbb..61c73433 100644 --- a/posts/DRAFT-paging.md +++ b/posts/DRAFT-paging.md @@ -266,6 +266,30 @@ pub fn translate(virtual_address: usize) -> Option { 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 diff --git a/src/memory/paging/mod.rs b/src/memory/paging/mod.rs index d6cf0b22..974d0393 100644 --- a/src/memory/paging/mod.rs +++ b/src/memory/paging/mod.rs @@ -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 {