use procfs::prelude::*;
fn main() {
if !rustix::process::geteuid().is_root() {
panic!("ERROR: Access to /proc/iomem requires root, re-run with sudo");
}
let page_size = procfs::page_size();
let iomem = procfs::iomem().expect("Can't open /proc/iomem");
let ram = iomem
.iter()
.filter_map(|(_, map)| if map.name == "System RAM" { Some(map) } else { None });
let mut kpagecount = procfs::KPageCount::new().expect("Can't open /proc/kpagecount");
for map in ram {
println!("Found RAM here: 0x{:x}-0x{:x}", map.address.0, map.address.1);
let (start_pfn, end_pfn) = map.get_range().get();
let page_references = kpagecount
.get_count_in_range(start_pfn, end_pfn)
.expect("Can't read from /proc/kpagecount");
let (pfn, refs) = page_references
.iter()
.enumerate()
.max_by(|(_, a), (_, b)| a.cmp(b))
.unwrap();
println!(
"Lots of references to this locations: addr=0x{:x}, pfn={}, refs={}",
pfn * page_size as usize,
pfn,
refs
);
}
}