Введение

Ссылка на конкретное место в памяти

В информатике адрес памяти — это ссылка на конкретное место в памяти, используемое на различных уровнях программным обеспечением и аппаратным обеспечением. Адреса памяти представляют собой последовательности цифр фиксированной длины, которые обычно отображаются и обрабатываются как беззнаковые целые числа. Эта числовая семантика основана на особенностях центрального процессора (таких как указатель команд и регистры инкремента адреса), а также на использовании памяти как массива, поддерживаемом различными языками программирования.

Физические адреса

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

Логические адреса

Компьютерная программа использует адреса памяти для выполнения машинного кода, а также для хранения и извлечения данных. В первых компьютерах логические и физические адреса совпадали, но с появлением виртуальной памяти большинство прикладных программ не оперируют физическими адресами. Вместо этого они используют логические, или виртуальные адреса, посредством блока управления памятью компьютера и отображения памяти операционной системы; см. ниже.

Единица разрешения адресов

Большинство современных компьютеров имеют байтовую адресацию. Каждый адрес идентифицирует один байт (восемь бит) памяти. Данные, превышающие один байт, могут храниться в последовательности последовательных адресов. Существуют компьютеры с адресацией по слову, где минимальным адресуемым блоком хранения является именно слово процессора. Например, миникомпьютер Data General Nova и микрокомпьютеры Texas Instruments TMS9900 и National Semiconductor IMP 16 использовали 16-битные слова, а многие 36-битные мэйнфреймы (например, PDP 10) использовали 18-битную адресацию по слову, а не байтовую, что обеспечило адресное пространство в 2<sup>18</sup> 36-битных слов, примерно 1 мегабайт памяти. Эффективность адресации памяти зависит от разрядности шины, используемой для адресов – чем больше битов используется, тем больше адресов доступно компьютеру. Например, 8-битная машина с байтовой адресацией и 20-битной адресной шиной (например, Intel 8086) может адресовать 2<sup>20</sup> (1 048 576) ячеек памяти, или 1 МиБ памяти, в то время как 32-битная шина (например, Intel 80386) адресует 2<sup>32</sup> (4 294 967 296) ячеек, или 4 ГиБ адресного пространства. В отличие от этого, 36-битная машина с адресацией по слову и 18-битной адресной шиной адресует только 2<sup>18</sup> (262 144) 36-битных ячеек (9 437 184 бита), что эквивалентно 1 179 648 8-битным байтам, или 1152 КиБ, или 1,125 МиБ — немного больше, чем у 8086. Некоторые старые компьютеры (децимальные компьютеры) использовали адресацию по десятичным цифрам. Например, каждый адрес в магнитной памяти на сердечниках IBM 1620 идентифицировал одну шестибитовую двоично-кодированную десятичную цифру, состоящую из бита четности, бита-флага и четырех цифровых битов. В 1620 использовались 5-значные десятичные адреса, поэтому теоретически максимально возможный адрес был 99 999. На практике процессор поддерживал 20 000 ячеек памяти, и можно было добавить до двух дополнительных внешних блоков памяти, каждый из которых поддерживал 20 000 адресов, в общей сложности 60 000 (00000–59999).

Размер слова против размера адреса

Размер слова — характеристика компьютерной архитектуры, обозначающая количество бит, которые процессор может обрабатывать за один такт. Современные процессоры, включая встраиваемые системы, обычно имеют размер слова 8, 16, 24, 32 или 64 бита; большинство современных компьютеров общего назначения используют 32 или 64 бита. Исторически использовались различные размеры, включая 8, 9, 10, 12, 18, 24, 36, 39, 40, 48 и 60 бит. Зачастую, говоря о размере слова современного компьютера, подразумевают и размер его адресного пространства. Например, компьютер, называемый «32-битным», как правило, поддерживает и 32-битные адреса памяти; 32-битный компьютер с байтовой адресацией может адресовать 232 = 4 294 967 296 байтов памяти, или 4 гибибайта (GiB). Это позволяет эффективно хранить один адрес памяти в одном слове. Однако это не всегда верно. У компьютеров могут быть адреса памяти, превышающие или не достигающие размера слова. Например, многие 8-битные процессоры, такие как MOS Technology 6502, поддерживали 16-битные адреса — иначе они были бы ограничены всего 256 байтами адресуемой памяти. 16-битные Intel 8088 и Intel 8086 поддерживали 20-битную адресацию посредством сегментации, что позволяло им обращаться к 1 МБ вместо 64 КБ памяти. Все процессоры Intel Pentium, начиная с Pentium Pro, включают расширения физических адресов (PAE), поддерживающие отображение 36-битных физических адресов на 32-битные виртуальные адреса. Многие ранние процессоры хранили 2 адреса в одном слове, например, 36-битные процессоры. Теоретически современные 64-битные компьютеры с байтовой адресацией могут адресовать 264 байта (16 экзабайтов), но на практике объём адресуемой памяти ограничен процессором, контроллером памяти или конструкцией печатной платы (например, количеством разъёмов для физической памяти или объёмом припаянной памяти).

Содержание каждого местоположения памяти

Каждое место в памяти компьютера с хранимой программой содержит двоичное или десятичное число. Интерпретация этого числа – как данных определенного типа или как инструкции – и его использование определяются инструкциями, которые извлекают и обрабатывают его. Некоторые ранние программисты объединяли инструкции и данные в словах, чтобы экономить память, когда она была дорогой: например, в машине Manchester Mark 1 в 40-битных словах было место для хранения небольших объемов данных – процессор игнорировал небольшой участок в середине слова – и это часто использовалось как дополнительное хранилище. Самовоспроизводящиеся программы, такие как вирусы, иногда рассматривают себя как данные, а иногда как инструкции. Самомодифицирующийся код в настоящее время обычно не рекомендуется к использованию, поскольку он значительно усложняет тестирование и сопровождение ради экономии нескольких байт, а также может приводить к неверным результатам из-за предположений, сделанных компилятором или процессором о состоянии системы, однако иногда он все же используется осознанно и с большой осторожностью.

Регулирование схем

Компьютерная программа может обратиться к адресу, заданному явно – в программировании низкого уровня это обычно называется абсолютным адресом, или иногда конкретным адресом, а в языках высокого уровня известно как тип данных «указатель». Но программа также может использовать относительный адрес, который определяет местоположение относительно другого места (базового адреса). Существует множество других способов косвенной адресации. Преобразование логических адресов в физическую и виртуальную память также добавляет несколько уровней косвенности; см. ниже.

Модели памяти

Многие программисты предпочитают обращаться к памяти так, чтобы не было различий между пространством кода и пространством данных (см. выше), а также между физической и виртуальной памятью (см. выше) — иными словами, численно идентичные указатели указывают на один и тот же байт оперативной памяти. Однако многие ранние компьютеры не поддерживали такую плоскую модель памяти — в частности, машины с архитектурой Гарварда требуют полного разделения хранилища программ и хранилища данных. Многие современные DSP (например, Motorola 56000) имеют три отдельных области хранения — для программ, коэффициентов и данных. Некоторые часто используемые инструкции одновременно выполняют выборку из всех трех областей — меньшее количество областей хранения (даже при том же общем объеме памяти) замедлило бы выполнение этих инструкций.

Модели памяти в архитектуре x86

Ранние процессоры x86 использовали сегментированную модель памяти, в которой адреса формировались на основе комбинации двух чисел: сегмента памяти и смещения внутри этого сегмента. Некоторые сегменты неявно рассматривались как сегменты кода, предназначенные для инструкций, сегменты стека или обычные сегменты данных. Несмотря на разное назначение, сегменты не имели различных уровней защиты памяти, соответствующих этому назначению. В плоской модели памяти все сегменты (регистры сегментов) обычно устанавливаются в ноль, и переменными остаются только смещения.