Я получаю адрес памяти по ссылке:
let TEST = 123;
let test = &TEST;
let test2 = test as *const i32;
let test3 = test2 as usize;
println!("{} {}", test3, test3);
println!("format: {}", usize::from_str_radix(&format!("{test3:X}"), 16).unwrap());
let dataAddr: *mut u32 = usize::from_str_radix(&format!("{test3:X}"), 16).unwrap() as *mut u32;
println!("data addr: {dataAddr:?}");
unsafe {
let data = core::ptr::read_volatile(dataAddr);
println!("{data}");
core::ptr::write_volatile(dataAddr, 0xff);
//let dataAddr: *mut u32 = 0x0d as *mut u32;
// core::ptr::write_volatile(dataAddr, 0xf);
let data = core::ptr::read_volatile(dataAddr);
println!("{data}");
}
extern crate page_size;
println!("{}", page_size::get());
Результат:
0x7fe92e076c
Наизменны только 0x7f..c.
Я так понимаю что могу работать только с этой памятью, дальше я узнал что на процесс выделяется 4гб.
page_size возвращает размер страницы памяти, заюзал его т.к. прочитал что память делится на страницы, пока не особо понял.
Так вот, он возвращает 4096, по идее это мегабайты.
Если попытаться записать по любому адресу между 7f..c - ошибки, 2 если точнее чередуются.
Для первой паника, для второй ошибка сегментации.
Отсюда вопрос, как мне во время выполнения определить адреса памяти с которыми я могу работать?
Программа запускается в termux/android: