Я пытаюсь понять, как unaligned memory access (UMA) работает на современных процессорах (а именно x86-64 и arm archures). Я получаю, что у меня могут возникнуть проблемы с UMA, начиная с дефодии префранции до отказа процессора. И я читал о posix_memalign и строках кэша.
Что я не могу найти, так это то, как современные системы/аппаратные средства обрабатывают ситуацию, когда мой запрос превышает границы страниц?
Вот пример:
1) Я malloc() блок памяти объемом 8 КБ.
2) Скажем, что malloc() не хватает памяти и sbrk() s 8KB для меня.
3) Ядро получает две страницы памяти (по 4 Кб каждая) и сопоставляет их в пространстве виртуального адреса процесса (скажем, что эти две страницы не одно за другим в памяти
4) movq (смещение + $0xffc),% rax; Я запрашиваю 8 байтов, начиная с 4092-го байта, что означает, что я хочу 4 байта от конца первой страницы и 4 байта от начала второй страницы.
физическая память:
---|---------------|---------------|-->
|... 4b| | |4b ...|-->
Мне нужно 8 байтов, разделенных на границах страницы.
Как работает MMU на x86-64 и руке? Существуют ли какие-либо механизмы в ядре mm, чтобы как-то подготовиться к подобному запросу? Есть ли какая-то защита в malloc? Что делают процессоры? Получают ли они две страницы?
Я хочу завершить такой запрос. MMU должен перевести один виртуальный адрес на два физических адреса. Как он обрабатывает такой запрос?
Я должен заботиться о таких вещах, если я программист и почему?
Я читаю много ссылок из google, SO, drepper cpumemory.pdf и gorman linux vmm book на данный момент. Но это океан информации. Было бы здорово, если бы вы хотя бы предоставили мне некоторые указатели или ключевые слова, которые я мог бы использовать.
Спасибо.