Передача данных <4 байтов в 32-битной системе - PullRequest
1 голос
/ 24 июня 2011

Мне было интересно узнать, как центральный процессор считывает отдельные байты и слова из физической памяти на машине с шириной шины 32 бита.После некоторого поиска я наткнулся на различные источники, утверждающие, что линии включения байтов шины управления используются для влияния на активацию банков четырех отдельных банков памяти, соответствующих байтам шины данных.

Я понимаю, что толькоадреса, равномерно делимые на четыре, размещаются на адресной шине.Однако все ли четыре байта считываются в шину данных, после чего отбрасываются некоторые неиспользованные байты?Например, скажем, процессор с 32-битной шиной данных решил прочитать слово, начинающееся с местоположения 1 (я знаю, что из-за выравнивания данных это маловероятно).Будет ли подход к прочтению этого слова:

  1. Поместите адрес 0 в адресную шину.
  2. Поместить байты 0, 1, 2 и 3. на шину данных.
  3. Сбросить байты 0 и 3 (очистить их соответствующие биты)
  4. Переставить байты 1 и 2на шине данных, чтобы байт 1 находился в 3-м банке, а байт 2 - в 4-м банке
  5. Передайте измененное значение на шине данных в данные памяти, зарегистрированные в блоке управления.

1 Ответ

2 голосов
/ 25 июня 2011

Очень сильно зависит от архитектуры. И помимо этого у вас есть процессорная шина (и) и, возможно, на другой стороне других чипов поддержки, возможно, dram или pcie или другие интерфейсы, которые также имеют свои собственные правила и нюансы. Или, если чип имеет несколько интерфейсов, то каждый интерфейс может отличаться.

В эти дни вы увидите, что вы описываете.

Чтения обладают большей гибкостью, чем записи, потому что, например, ваша память или периферийная система может быть настолько простой, как все 32-битной, а интерфейс памяти, расположенный ближе к процессору, может выбирать и манипулировать байтовыми линиями без ведома периферии или памяти. Иногда у вас есть строки выбора байтов, которые сообщают периферийному устройству все, что меня волнует, являются ли эти байтовые дорожки, и периферийное устройство может выбрать тупой и простой и просто поместить все четыре байта туда или просто заполнить запрошенные байты и оставить другие строки плавающими или управляемый устаревшими данными или высокий или низкий. Некоторые системы требуют, чтобы вы выравнивали данные вправо или влево, поэтому, если вы хотите, чтобы байт по адресу 0x01, интерфейс памяти мог ожидать, что результирующий байт будет находиться в самой левой или самой правой полосе байтов в зависимости от порядка байтов (я не ограничиваю этот ответ х86 кстати).

Для записи требуется больше подробностей, если у вас есть система, в которой вам разрешено (система определила), что вы можете записывать отдельные байты, но шина 32-битная, тогда вы можете иметь правую или левую выровненную вещь и указать адрес и размер. Или вы можете сделать байтовую вещь, и обе стороны должны выбрать данные в правильных байтовых дорожках. Записываемое периферийное устройство в этой ситуации должно будет управлять операциями чтения-изменения-записи (запись в 32-разрядную память, содержащую 0x12345678, байт 0x55 по адресу 0x02 должен привести к 0x12555678, когда запись завершится, в этом случае периферийное устройство должно прочитайте 0x12345678, измените один байт, затем запишите 32 бита обратно в память.

x86 - очень болезненная платформа, она допускает непривязанные доступы. Многие другие платформы принудительно выравнивают память, делая код проще, выполнение более плавным, а интерфейсы памяти и периферийные устройства проще (меньше логики, меньше энергии, меньше всего, кроме производительности). Таким образом, для подобных систем у вас все еще есть байтовые дорожки для отдельных байтовых обращений, но вам не нужно беспокоиться о 32-битной записи по адресу 0x01, которая обычно обрабатывается на x86, например, с двумя доступами - 24-битным по адресу 1 и 8. бит по адресу 0, поэтому unaligned, хотя Legal плохо работает на платформе x86, снижает вашу производительность в два раза. Выравнивание означает, что 32-битные доступы могут быть только по адресам с младшими двумя битами, равными нулю, (от 2 до 2 байтов или 4 байта), 0x0, 0x04, 0x08, 0x0c, 0x10 и т. Д. границы степени 1, адреса с младшим битом ноль, 0x0 0x02 0x04 0x06 0x08. и байты находятся на границах байтов, 2 до степени 0, 0x01 0x02 0x03 0x04 и т. д.

В некоторых системах и, в общем, как это обрабатывается сегодня в ваших системах x86, например, когда у вас есть DRAM (DDR и т. Д.), В частности интерфейсы оперативной памяти с возможностями ecc, на самом уровне памяти вы можете писать только в полном N количество битов, например, 64 бита с 8 битами ecc, потому что в этом случае они должны вычислить 8 бит ecc из 64 битов данных и записать все 72 бита за раз, при обратном чтении все 72 бита считываются и проверяются, если хорошо, что 64 бита данных возвращаются пользователю / программе. Как все это обычно работает, через слои кэширования, одна из прелестей кэширования заключается в том, что он находится между процессором и большей системой памяти. По крайней мере, в случаях чтения вы можете прочитать байт, но кэш может считывать 128 битов или любой другой размер строки кэша, который обычно составляет некоторое целое число единиц памяти. Эта строка кэша остается в кэше, когда вы записываете в байт рядом с тем, который вы только что прочитали, или, возможно, в тот же байт, он изменяет этот байт в кэше, в конце концов, когда ему нужно извлечь эти данные из памяти, он записывает всю строку кэша назад, в хороших эффективных целых единицах для памяти. запись байта с пропуском кеша и тому подобное все еще включают чтение-изменение-запись.

С кэш-системами или без них иногда интерфейс памяти на процессоре или ближе к нему управляет операциями чтения-изменения и обеспечивает доступ к периферийным устройствам или основной памяти только в режиме выравнивания по словам (где слово составляет 16, 32 или 64 бита. независимо от того, что эта система памяти определила как размер этой шины).

Вчера я смотрел на распиновку старого x86 и забыл, что данные и часть адресной шины находятся на тех же выводах. Были периоды адресации в цикле памяти и частях данных, и процессор и периферийные устройства должны были бы изменить направления или, по крайней мере, использовать какой-либо метод для управления шиной. Дело в том, что за всю историю архитектуры x86 все изменилось и продолжает меняться. Таким образом, этот ответ, зависящий от архитектуры, не может быть ограничен только x86, вы должны быть очень конкретны в отношении расположения штырьков / пэдов, а также набора микросхем, который идет с ним. ARM также за свою жизнь изменился и предлагает одни и те же ядра, иногда с разными вариантами интерфейсов (например, 32-битный AXI или 64-битный AXI).

Драм также добавляет усложнение обновления, так что кто-то где-то должен постоянно бегать по памяти, чтобы она оставалась активной, между доступами, управляемыми процессором или кешами. Аналогично, ecc добавляет усложнение, что если есть ошибка в одном бите, в идеале кому-то нужно выполнить обратную запись с исправленным битом. Таким образом, чтение байтов может вызвать 32-битную запись независимо от того, что делает программное обеспечение. Если нет механизма обратной записи, то глупо иметь ecc-защиту, просто использовать четность или без нее.

Интерфейс Wishbone, с которым я на самом деле не знаком, но вижу, что он используется во всех opencores, вероятно, это то, на что вы можете взглянуть и почувствовать.Аналогично, в любом семействе x86 будет, или, по крайней мере, в старшем семействе есть справочные руководства по аппаратному обеспечению, в которых описывается синхронизация интерфейса памяти / ввода-вывода на краю чипа.Для ARM вы можете использовать google для amba и axi, и если вы получите trm (технические справочные руководства) (бесплатно на веб-сайте оружия) для их кэшей, вы можете получить представление о том, как работают их интерфейсы памяти.Точно так же распиновка DDR и детали должны быть доступны от продавцов или возможно даже в Википедии.DDR и QDR становятся еще более увлекательными, так как вы начинаете понимать, что происходит в полупериоде, традиционно вы меняете шины только один раз за такт или несколько тактов, а теперь мы находимся в процессе изменения в середине такта и того хуже.могут быть часы на устройство памяти и отдельные часы назад от устройства памяти, чтобы учесть потери длины трассировки и попытаться помочь с этим полупериодом.Это очень грязно, что позволяет вернуться к старым чипам (808x, 6502, 6800, z80 и т. Д.), Посмотреть на их шины памяти и продолжить работу.Аналогично посмотрите на ISA, прежде чем пытаться погрузиться в PCI или PCIe.

Вау, длинный ответ, извините за это, надеюсь, это полезно.

...