Каков размер слова оперативной памяти в 32/64-битной машине (процессоре)?

Каков размер слова оперативной памяти в 32/64-битной машине (процессоре)?

Каков размер слова оперативной памяти в 32/64-битной машине (процессоре)?

Этот вопрос сводит меня с ума. Каков точный размер слова, которое сохраняет данные в самой оперативной памяти в 64-битных машинах, таких как микропроцессоры Intel Core i5?

Кроме того, меняется ли размер слова, в котором хранятся данные, с 32 бит на 64 бита?

решение1

Традиционно «слово» в компьютерных архитектурах было, как правило, наименьшей адресуемой единицей памяти. И традиционно это было то же самое, что и размер регистра общего назначения машины.

Однако с тех пор, как байтовая адресация стала популярной, эта концепция стала размываться. (Вероятно, за это стоит поблагодарить IBM System/360 и PDP-11 со стороны мини-компьютеров.)

С точки зрения адресации памяти, как она определена архитектурой ЦП, то есть, как программисты видят машину, концепция «слова» не существует на x86/x64, если только вы не считаете ее синонимом байтов. Каждый байт памяти имеет свой собственный адрес, и адрес байта также является адресом любой более крупной области, которая начинается с этого байта (расширяясь до адресов с более высокими номерами). Мы, конечно, можем перемещать один, два, четыре или (на x64) восемь байтов за раз между регистром и ОЗУ — или гораздо больше, из памяти в память, с помощью инструкций REP — но адрес, который мы утверждаем, все еще является адресом байта. Мы можем выполнять арифметические действия со словами всех этих размеров. (И других.)

Если вы мыслите в терминах регистров, то "размер слова" машины обычно предполагается таким же, как и у ее регистров общего назначения. Это будет 32 бита на x86, 64 бита на x64. В большинстве архитектур размер GPR — это размер наибольшего целого числа, с которым ЦП может выполнить простую арифметику с помощью одной инструкции.

А теперь давайте внесем еще больше путаницы...!

С точки зрения платформы (материнская плата, модули и чипы ОЗУ и т. д.), на всех машинах, использующих "товарные" процессоры и чипсеты Intel и AMD, ОЗУ адресуется 64-битными блоками - полагаю, их можно назвать словами. Вы могли это очень четко видеть на более ранних процессорах, которые имели отдельные контакты для адреса и данных: наименее значимый контакт адреса называется A3, а не A0! Физические биты адреса A0, A1 и A2 никогда не покидают процессор. Но программисты никогда не видят такие адреса.

И, наконец, есть понятие «строка кэша». Строка кэша — это физически непрерывный фрагмент оперативной памяти, который занимает одну запись в кэше L1/L2/L3. Строки кэша в мире Intel/AMD уже некоторое время имеют ширину 64 байта. Поэтому, когда вы обращаетесь к адресу памяти, которого в данный момент нет в вашем кэше, процессор извлекаетвосемьиз этих 8-байтовых фрагментов оперативной памяти. Другими словами, адреса, которые хранятся в кэше, опускают младшие шесть бит. Так что, может быть, словов кэшена самом деле 64 байта или 512 бит! (Но доступ к памяти, который обходит кэш, все равно может считывать или записывать только 8 байтов за раз; в диапазонах физических адресов, которые декодируются устройствами ввода-вывода с отображением в памяти, отдельные байты могут быть адресуемыми; это зависит от шины. И, конечно, мы не можем выполнять арифметические действия с 512-битными целыми числами.)

В средах программирования, производных от Microsoft C, «слово» — это 16 бит — так было задолго до Microsoft, а название и определение типа данных были перенесены в 32- и 64-битные среды для совместимости. «Двойное слово» (или DWORD или LONG, для «длинного слова», этот термин был распространен в VAX) — это 32 бита. 64-битные целые числа называются «квадворками» в архитектуре, но обычно имеют более конкретные названия в C, например UINT64 (64-битное целое число, без знака).

Итак, это зависит от того, где вы находитесь в системе и на что вы смотрите. Мы обычно вообще не думаем о "размере слова" в наши дни, скорее о "размере GPR".

решение2

Я не знаком с кровавыми подробностями того, как RAM работает с процессорами Intel в наши дни, учитывая новые вещи, такие как когерентность кэша и NUMA, но с точки зрения RAM я считаю, что это все еще 8-битные байты, хотя RAM теперь обычно организована в каналы, где к нескольким слотам можно получить доступ одновременно. Так что захват 4 байтов (предполагая 4 слота) за раз займет столько же времени, сколько захват 1 байта в такой системе. Тем не менее, RAM принимает адрес от контроллера памяти в качестве входных данных и возвращает его обратно 8 бит в качестве выходных данных AFAIK.

Размер "слова" может означать разные вещи. Я помню, как впервые столкнулся с этим термином, изучая язык ассемблера 68000 - в тексте, который я читал, "байт" означал 8 бит, а "слово" - 16 бит, а "выровненный по слову" означал адрес, попадающий на границу 16 бит. Я знаю, что термин "слово" использовался до появления 68000 (1980?) и мог быть синонимом "байта" в более ранние времена.

«Родные» данные, с которыми «предпочитает» работать ЦП, соответствуют «битности» его архитектуры и режиму, в котором он работает. 32-битный ЦП (или 64-битный ЦП не в «длинном режиме») имеет 32-битные регистры, кучу инструкций для загрузки значений из ОЗУ (4 байта) в эти регистры и прочее. Но в Intel 32-битный регистр, такой как EAX, также может быть адресован как два регистра AH (старшие 16 бит EAX) и AL (нижние 16 бит), и существует бесчисленное множество инструкций MOV, которые загружают данные из ОЗУ в EAX, AH, AL, а оттуда обратно в ОЗУ. Мне сейчас лень заглядывать в справочник программиста Intel, но я думаю, что там есть инструкции для загрузки отдельных байтов либо в старшие, либо в нижние 8 бит AH или AL. (Я знаю, что в MIPS есть такие инструкции). Но я думаю, что есть больше инструкций, которые работают со всеми 32 битами, и если вы хотите работать с меньшим количеством бит, вы теряете эффективность, поскольку вам сначала приходится перемещать данные во временные регистры и т. п.

Так что в Intel и большинстве других универсальных ЦП, выпущенных после 16-битной эры, вы действительно гибки в том, как вы адресуете память. Инструкции, вероятно, более оптимизированы для работы в "битности" архитектуры.

Связанный контент