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