4

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

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

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

2 ответа2

4

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

Однако с тех пор, как байт-адресация стала популярной, эта концепция стала размытой. (Вероятно, за это мы можем отдать должное 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".

3

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .