1 stable release

new 1.0.0 Feb 15, 2025

#413 in Unix APIs

Download history 105/week @ 2025-02-11

105 downloads per month
Used in agesafetch

MIT license

36KB
512 lines

linux-memutils

License: MIT REUSE Status

Basic utilities for reading from physical memory on Linux.

Features

This crate provides modules for:

  • Parsing the physical memory map provided by Linux's /proc/iomem file.
  • Tolerantly reading data from the /dev/mem character device file without erroring out on inaccessible bytes.
  • Searching for the system firmware's AGESA version in physical memory.

Usage

Add the dependency to your Cargo.toml:

[dependencies]
linux-memutils = "1.0.0"

Examples

Obtaining memory regions in /proc/iomem

use linux_memutils::iomem;

fn main() {
    let memory_map = iomem::parse_proc_iomem().unwrap();

    let third_memory_region = &memory_map[2];
    println!("{third_memory_region}");
    // => [0x000000000009f000-0x000000000009ffff] (Reserved)
}

Reading bytes from a region in physical memory

use linux_memutils::reader;
use std::fs::File;

fn main() {
    // [...]

    let file = File::open("/dev/mem").unwrap();
    let reader = reader::SkippingBufReader::new(
        file,
        third_memory_region.start_address,
        Some(third_memory_region.end_address),
    );

    // Our `reader` can now be used similarly to an io:BufReader,
    // the key difference being that it skips inaccessible bytes
}

Finding the system firmware's embedded AGESA version

use linux_memutils::agesa;

fn main() {
    match agesa::find_agesa_version().unwrap() {
        Some(found_version) => {
            println!("{}", found_version.agesa_version)
        }
        None => eprintln!("Did not find AGESA version.")
    }
}

⚠️ Note that these examples need to be run with elevated privileges.

Documentation

Please refer to the documentation on docs.rs for detailed information.

License

This project is licensed under the MIT license. See LICENSE for more information.

Author

Dependencies

~0.6–1.1MB
~22K SLoC