use pagemap::{PageMap, PageMapError};
fn main() -> Result<(), PageMapError> {
let pid = std::process::id() as u64;
let mut pm = PageMap::new(pid)?;
let ptr = unsafe {
libc::mmap(
std::ptr::null_mut(),
pagemap::page_size()? as usize,
libc::PROT_READ | libc::PROT_WRITE,
libc::MAP_PRIVATE | libc::MAP_ANONYMOUS,
-1,
0,
)
};
assert_ne!(ptr, std::ptr::null_mut(), "mmap(2) failed");
eprintln!("ptr = {:#?}", ptr);
let vma = pm
.maps()?
.into_iter()
.find(|me| me.memory_region().contains(ptr as u64))
.expect("mapping not found")
.memory_region();
eprintln!("vma = {}", vma);
let pagemap_entries = pm.pagemap_region(&vma)?;
assert_eq!(1, pagemap_entries.len());
let pagemap_entry = pagemap_entries[0];
eprintln!("pagemap_entry (before)\t= {}", pagemap_entry);
assert!(!pagemap_entry.present() && !pagemap_entry.swapped());
unsafe { libc::memset(ptr, 0xff, pagemap::page_size()? as usize) };
let pagemap_entry = pm.pagemap_region(&vma)?[0];
eprintln!("pagemap_entry (after)\t= {}", pagemap_entry);
assert!(pagemap_entry.present());
Ok(())
}