который я хочу прочитать байт по определённому адресу в определённый регистр
Что происходит? Адрес идёт в MMU, дальше проверяется кеш, потом что? Может есть где-то этот workflow объяснён в общем виде
Как это что? И получают, через контакты данных. Тебе непонятно с какой стороны обьяснять. Показать что-ли где они находятся, из каких элементов сделаны, или что?
Нужно что-то в этом духе (ниже псевдообъяснение): Адрес памяти из регистра A попадает в MMU, дальше проверяется кеш, если в кеше нашлось, то отдаёт если нет то идёт дальше и т.п.
Адрес памяти из регистра A попадает в MMU, дальше проверяется кеш, если в кеше нашлось, то отдаёт если нет то идёт дальше по кэшу, если не нашлось - обращается по шине данных к RAM, если не нашлось, то ищет на накопителях, если не нашлось - на жёстких дисках
ладно, если у тебя нет настроения можешь не объяснять
по крайней мере нам это дело в унике обьясняли именно так
к асму это получается не имеет отношения. с помощью асма мы говорим процу "сделай тото". как он это будет делать его проблемы (уровень абстракции). тебе наверное у процессоро строителей надо это спросить, а не у программистов
Если есть чат по процессору строению то я бы спросил А вообще мне это нужно чтобы понять почему процессор работает медленнее с памятью, если она не выровнена. Я же так понимаю, что выравнивание каприза hardware Да, я видел объяснения где рассказывают что процессору придётся два раза обращаться к памяти чтобы собрать нужные байты в кучу, если память не выровнена. Но на физическом уровне я до сих пор не совсем понимаю почему процессор не читает с любого места и не загружает последовательно байты с этого места, и ему именно надо чтобы адреса были выровнены по размеру запрашиваемых данных
Я подумал что ты какой-то недовольный аля "щас докопаюсь". Но ты мне, кажется, помог продвинуться дальше, спасибо
Просто я изначально вопроса не понял - думал, что ты хочешь узнать, как процессор ищет запрашиваемые данные. Пожалуйста
Это я тоже хотел знать, чтобы разобраться в выравнивании. А ты мне сузил круг до кеш линий
ну вот для х86 и х86-64 это устроено так начнем с того что само ядро имеет кешы первого уровня ядро - контрол юнит и алу(условно, мб там ещё для флоатов для крипты или ещё чего нам сейчас не важно) так вот контрол собственно заведует операндами, он берет их из кеша сам кеш это что-то вроде масива из set'ов. один set хранит несколько скажем 'линий'(но там не линия, как то по другому называлось, я забыл уже). в этой 'линии' есть тег(кусок адреса, он есть ключ по которому ищем), флаги, и кеш линия(собственно данные из памяти, то что мы и хотим загрузить из кеша в контрол юнит). пространство кеша ограничено, оно математически рассчитано так, что данные которые сохраняются в кеш линию выровнены на определенное парное число. проблема появляется когда я не выровнял что-то в памяти и для загрузки процесору нужно взять первую кеш линию, отрезать от неё кусок, а потом ещё и найти остачу нашей переменной в другой кеш линии.
Я уже писал про отсуствие (для экономии) нижних битов адресной шины. В пррцессоре куча блоков, соединений, промежуточных буфферов. Чтение блоками фиксированного размера в каждом подобном месте - частично экономия (и бюджета по энергопотреблению/температуре тоже) частично оптимальный дизайн во избежание проблем с синхронизацией и когерентностью. Вообще рекомендую сайт ixbt dot com - в нулевых и начале десятых там было много статей с подробными объяснениями как работают современные процессоры и их внутренними механизмы. Потом подсдулись в этом плане, но статьи есть по архитектурам вплоть до сэнди бриджа примерно очень подробные и более лаконичные по поледующим.
Обсуждают сегодня