Задать вопрос
@historydev
Редактирую файлы с непонятными расширениями

Как получить адреса памяти с которыми можно работать?

Я получаю адрес памяти по ссылке:
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:
66802a1f69d5a948151957.jpeg
  • Вопрос задан
  • 228 просмотров
Подписаться 1 Сложный 17 комментариев
Решения вопроса 1
@SunTechnik
1. Приложения во всех современных многозадачных ОС работают в виртуальных адресных пространствах.
2. Нельзя просто так обратиться к произвольному адресу.
3. Перед использованием, у ОС надо запросить память. Это может происходить статически, при запуске программы (в коде объявлены переменные) или динамически (вызов malloc, использование конструкторов класса итд).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы