Сам посчитай. 16 разрядный сегментный
регистр который сдвигался влево на 4 бита позволял тебе видеть только 20 бит адресов.
В реальном режиме процессора всё адресное пространство делится на одинаковые сегменты размером 65536 байт (
2
16
{\displaystyle 2^{16}} байт). Начало каждого последующего сегмента (так называемая База сегмента) смещено относительно базы предыдущего на минимальный размер сегмента, то есть на 16 байт (т. н. параграф). Таким образом, сегменты могут частично перекрывать друг друга. (Например, байт 17 сегмента 2 — это также и байт
1
=
17
−
16
{\displaystyle 1=17-16} сегмента 3, и байт
33
=
17
+
16
{\displaystyle 33=17+16} сегмента 1.)
База сегмента) смещено относительно базы предыдущего на минимальный размер сегмента, то есть на 16 байт (т. н. параграф). Таким образом, сегменты могут частично перекрывать друг друга.
let TEST = 123;
let test = &TEST;
let test2 = test as *const i32;
let test3 = test2 as usize;
println!("{} {}", test3, test3);
let dataAddr: *mut u32 = usize::from_str_radix(&format!("{test3:X}"), 16).unwrap() as *mut u32;
println!("{dataAddr:?}");
unsafe {
let data = core::ptr::read_volatile(dataAddr);
println!("{data}{test3:X}");
}
В частности:
https://ru.m.wikipedia.org/wiki/%D0%A1%D0%B5%D0%B3...
Виртуальная память - я понимаю что не работаю напрямую с памятью, я так-же понимаю что виртуальные адреса транслируются в реальные и что менеджер памяти в случае её нехватки может хранить данные на диске.
Сегменты - ТРИЖДЫ перечитал и что мне это дало?
Я понял что сегменты это N байт памяти которые выделяются менеджером по запросу программы.
Я пытаюсь прочитать сегмент по адресу N и извлечь данные из него.
То есть в моём случае байты которые я пытаюсь прочесть пусты, поэтому я получаю ошибки или что?