30.4.3. НЕВЫРОВНЕННОЕ ОБРАЩЕНИЕ К ПАМЯТИ
Предположим что у микропроцессора 32-битная шина данных
Рассмотрим обращения к памяти:
Байт
Байт не может быть невыровненным
Т.е. достук к нему всегда будет проходить одним циклом шины:
При чтении мы можем читать челый dword.
+---+---+---+---+
| | X | | |
+---+---+---+---+
| |
+---------------+
читаем все
Но при записи в память мы должны будем выставить сигналы BE (Byte Enable) для
того что бы память знала какой байт реально записывать.
BE[3..0] Byte address Циклов шины
+---+---+---+---+
+0000 | X | | | | 1000 00000003h 1
+---+---+---+---+
+---+---+---+---+
+0000 | | X | | | 0100 00000002h 1
+---+---+---+---+
+---+---+---+---+
+0000 | | | X | | 0010 00000001h 1
+---+---+---+---+
+---+---+---+---+
+0000 | | | | X | 0001 00000000h 1
+---+---+---+---+
Слово
При чтении слова мы уже можем попасть/можем непопасть в невыровненую память
(сразу же пишем маски для BE):
BE[3..0] Word Address Циклов шины
+---+---+---+---+
+0000 | | | X | X | 0011 00000000h 1
+---+---+---+---+
+---+---+---+---+
+0000 | | X | X | | 0110 00000001h 1
+---+---+---+---+
+---+---+---+---+
+0000 | X | X | | | 1100 00000002h 1
+---+---+---+---+
+---+---+---+---+
+0000 | X | | | | 1000 00000003h 2
+---+---+---+---+
+0004 | | | | X | 0001
+---+---+---+---+
Таким образом для невыровненных (на границу 2) слов мы имеем 50%
невыровненных обращений к памяти.
Двойное слово
BE[3..0] Dword address Циклов шины
+---+---+---+---+
+0000 | X | X | X | X | 1111 00000000h 1
+---+---+---+---+
+---+---+---+---+
+0000 | X | X | X | | 1110 00000001h 2
+---+---+---+---+
+0004 | | | | X | 0001
+---+---+---+---+
+---+---+---+---+
+0000 | X | X | | | 1100 00000002h 2
+---+---+---+---+
+0004 | | | X | X | 0011
+---+---+---+---+
+---+---+---+---+
+0000 | X | | | | 1000 00000003h 2
+---+---+---+---+
+0004 | | X | X | X | 0111
+---+---+---+---+
Таким образом невыровненный dword - это стопудовый 2й цикл шины.
Summary
Как правило компиляторы выравнивают данные.
Но есть ситуации когда это невозможно - например данные в сетевых пакетах,
или на storage.
Что делает процессор при обращении к невыровненной памяти:
o Некоторые процессоры генерируют 2 такта шины
o Некоторые процессоры имеют разные команды для
доступа к aligned/unaligned памяти
(соответсвенно они работают по разным алгоритмам и
разное время).
Если попытатся обратится к unaligned памяти aligned
командой то возникнет aligned exception,
в которой как правило грузят данные из unaligned памяти
и возвращаются.
o Есть процессоры которые вообще не обращаются к unaligned
памяти, они генерируют exception, а программа обработчик
сама вытаскивает байты и их соединяет.
Кроме того обращение к невыровненной памяти должно иметь
гарантированные 2 цикла шины подряд (что бы 2й процессор или аппаратура
ввода/вывода не смогли модифицировать часть данных).
Для этого как правило на шину выставляется сигнал LOCK.
Index Prev Next