// source: fs/proc/task_mmu.c
bitflags! { /// Represents the fields and flags in a page table entry for a swapped page. #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, PartialOrd, Ord)] pubstruct SwapPageFlags: u64 { /// Swap type if swapped #[doc(hidden)] const SWAP_TYPE = genmask(MAX_SWAPFILES_SHIFT - 1, 0); /// Swap offset if swapped #[doc(hidden)] const SWAP_OFFSET = genmask(54, MAX_SWAPFILES_SHIFT); /// PTE is soft-dirty const SOFT_DIRTY = 1 << 55; /// Page is exclusively mapped const MMAP_EXCLUSIVE = 1 << 56; /// Page is file-page or shared-anon const FILE = 1 << 61; /// Page is swapped #[doc(hidden)] const SWAP = 1 << 62; /// Page is present const PRESENT = 1 << 63;
}
}
impl SwapPageFlags { /// Returns the swap type recorded in this entry. pubfn get_swap_type(&self) -> u64 {
(*self & Self::SWAP_TYPE).bits()
}
/// Returns the swap offset recorded in this entry. pubfn get_swap_offset(&self) -> u64 {
(*self & Self::SWAP_OFFSET).bits() >> MAX_SWAPFILES_SHIFT
}
}
bitflags! { /// Represents the fields and flags in a page table entry for a memory page. #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, PartialOrd, Ord)] pubstruct MemoryPageFlags: u64 { /// Page frame number if present #[doc(hidden)] const PFN = genmask(54, 0); /// PTE is soft-dirty const SOFT_DIRTY = 1 << 55; /// Page is exclusively mapped const MMAP_EXCLUSIVE = 1 << 56; /// Page is file-page or shared-anon const FILE = 1 << 61; /// Page is swapped #[doc(hidden)] const SWAP = 1 << 62; /// Page is present const PRESENT = 1 << 63;
}
}
impl MemoryPageFlags { /// Returns the page frame number recorded in this entry. pubfn get_page_frame_number(&self) -> Pfn {
Pfn((*self & Self::PFN).bits())
}
}
let mask = genmask(3, 0);
assert_eq!(mask, 0b1111);
let mask = genmask(63, 62);
assert_eq!(mask, 0b11 << 62);
}
#[test] fn test_page_info() { let pagemap_entry: u64 = 0b1000000110000000000000000000000000000000000000000000000000000011; let info = PageInfo::parse_info(pagemap_entry); iflet PageInfo::MemoryPage(memory_flags) = info {
assert!(memory_flags
.contains(MemoryPageFlags::PRESENT | MemoryPageFlags::MMAP_EXCLUSIVE | MemoryPageFlags::SOFT_DIRTY));
assert_eq!(memory_flags.get_page_frame_number(), Pfn(0b11));
} else {
panic!("Wrong SWAP decoding");
}
let pagemap_entry: u64 = 0b1100000110000000000000000000000000000000000000000000000001100010; let info = PageInfo::parse_info(pagemap_entry); iflet PageInfo::SwapPage(swap_flags) = info {
assert!(
swap_flags.contains(SwapPageFlags::PRESENT | SwapPageFlags::MMAP_EXCLUSIVE | SwapPageFlags::SOFT_DIRTY)
);
assert_eq!(swap_flags.get_swap_type(), 0b10);
assert_eq!(swap_flags.get_swap_offset(), 0b11);
} else {
panic!("Wrong SWAP decoding");
}
}
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.3Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.