В вычислительной технике адрес памяти — это ссылка на определенную ячейку памяти , используемую на разных уровнях программным обеспечением и оборудованием . [1] Адреса памяти — это последовательности цифр фиксированной длины, которые традиционно отображаются и обрабатываются как целые числа без знака . Такая числовая семантика основана на функциях ЦП (таких как указатель инструкций и регистры инкрементного адреса ), а также на использовании памяти как массива, поддерживаемого различными языками программирования .
Основная память цифрового компьютера состоит из множества ячеек памяти . Каждая ячейка памяти имеет физический адрес , который является кодом. Центральный процессор (или другое устройство) может использовать код для доступа к соответствующей ячейке памяти. Обычно только системное программное обеспечение , то есть BIOS , операционные системы и некоторые специализированные служебные программы (например, тестеры памяти ), обращаются к физической памяти с помощью операндов машинного кода или регистров процессора , давая команду центральному процессору направить аппаратное устройство, называемое контроллером памяти , на использование шины памяти или системной шины или отдельных шин управления , адреса и данных для выполнения команд программы. Шина контроллеров памяти состоит из ряда параллельных линий, каждая из которых представлена двоичной цифрой (битом). Ширина шины и, следовательно, количество адресуемых блоков хранения и количество бит в каждом блоке различаются в зависимости от компьютера.
Компьютерная программа использует адреса памяти для выполнения машинного кода , а также для хранения и извлечения данных . В ранних компьютерах логические и физические адреса соответствовали друг другу, но с появлением виртуальной памяти большинство прикладных программ не имеют знаний о физических адресах. Вместо этого они адресуют логические адреса или виртуальные адреса , используя блок управления памятью компьютера и отображение памяти операционной системы ; см. ниже.
Большинство современных компьютеров имеют байтовую адресацию . Каждый адрес идентифицирует один байт ( восемь бит ) памяти. Данные размером больше одного байта могут храниться в последовательности последовательных адресов. Существуют компьютеры со словной адресацией , где минимальной адресуемой единицей хранения является слово процессора . Например, мини-компьютер Data General Nova , а также микрокомпьютеры Texas Instruments TMS9900 и National Semiconductor IMP-16 использовали 16-битные слова , и было много 36-битных мэйнфреймовых компьютеров (например, PDP-10 ), которые использовали 18-битную адресацию слов , а не байтовую , что давало адресное пространство из 2 18 36-битных слов, примерно 1 мегабайт памяти. Эффективность адресации памяти зависит от разрядности шины, используемой для адресов — чем больше бит используется, тем больше адресов доступно компьютеру. Например, 8-битная байтовая адресная машина с 20-битной адресной шиной (например, Intel 8086 ) может адресовать 2 20 (1 048 576) ячеек памяти или один МиБ памяти, в то время как 32-битная шина (например, Intel 80386 ) адресует 2 32 (4 294 967 296) ячеек или адресное пространство 4 ГиБ . Напротив, 36-битная пословная адресная машина с 18-битной адресной шиной адресует только 2 18 (262 144) 36-битных ячеек (9 437 184 бит), что эквивалентно 1 179 648 8-битным байтам или 1152 КиБ или 1,125 МиБ — немного больше, чем 8086.
Некоторые старые компьютеры ( десятичные компьютеры ) имели десятичную адресацию . Например, каждый адрес в памяти магнитного сердечника IBM 1620 идентифицировал одну шестибитную двоично-кодированную десятичную цифру, состоящую из бита четности , бита флага и четырех числовых битов. 1620 использовал пятизначные десятичные адреса , поэтому теоретически максимально возможный адрес составлял 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-битный компьютер может адресовать 2 32 = 4 294 967 296 байт памяти, или 4 гибибайта (ГиБ). Это позволяет эффективно хранить один адрес памяти в одном слове.
Однако это не всегда верно. Компьютеры могут иметь адреса памяти больше или меньше размера их слова. Например, многие 8-битные процессоры, такие как MOS Technology 6502 , поддерживали 16-битные адреса — в противном случае они были бы ограничены всего лишь 256 байтами адресации памяти. 16-битные Intel 8088 и Intel 8086 поддерживали 20-битную адресацию через сегментацию , что позволяло им получать доступ к 1 МиБ вместо 64 КБ памяти. Все процессоры Intel Pentium , начиная с Pentium Pro, включают расширения физических адресов (PAE), которые поддерживают отображение 36-битных физических адресов в 32-битные виртуальные адреса. Многие ранние реализации LISP , например, на 36-битных процессорах, содержали 2 адреса на слово в результате недостатка . Некоторые ранние процессоры содержали 2 и даже 3 адреса на слово инструкции.
Теоретически современные 64-разрядные компьютеры с байтовой адресацией могут адресовать 2 64 байта (16 эксбибайт ), но на практике объем памяти ограничен процессором, контроллером памяти или конструкцией печатной платы (например, количеством физических разъемов памяти или объемом припаянной памяти).
Каждая ячейка памяти в компьютере с хранимой программой содержит двоичное число или десятичное число некоторого вида . Его интерпретация, как данных некоторого типа данных или как инструкции, и использование определяются инструкциями , которые извлекают и манипулируют им.
Некоторые ранние программисты объединяли инструкции и данные в слова, чтобы сэкономить память, когда это было дорого: Manchester Mark 1 имел пространство в своих 40-битных словах для хранения небольших битов данных — его процессор игнорировал небольшой раздел в середине слова — и это часто использовалось как дополнительное хранилище данных. [ требуется цитата ] Самовоспроизводящиеся программы, такие как вирусы, иногда рассматривают себя как данные, а иногда как инструкции. Самоизменяющийся код в настоящее время, как правило, устарел , поскольку он делает тестирование и обслуживание непропорционально сложными по сравнению с экономией нескольких байтов, а также может давать неверные результаты из-за предположений компилятора или процессора о состоянии машины , но иногда все еще используется преднамеренно, с большой осторожностью.
В современной многозадачной среде процесс приложения обычно имеет в своем адресном пространстве (или пространствах) фрагменты памяти следующих типов:
Некоторые части адресного пространства могут вообще не отображаться.
Некоторые системы имеют архитектуру «разделенной» памяти , где машинный код, константы и данные находятся в разных местах и могут иметь разные размеры адресов. Например, микроконтроллеры PIC18 имеют 21-битный программный счетчик для адресации машинного кода и констант во флэш-памяти и 12-битные адресные регистры для адресации данных в SRAM.
Компьютерная программа может получить доступ к адресу, указанному явно — в низкоуровневом программировании это обычно называетсяабсолютный адрес , или иногда конкретный адрес, и известен какуказательныйтип данных в языках более высокого уровня. Но программа может также использоватьотносительный адрес, который указывает местоположение относительно чего-то еще ( базовый адрес ). Существует много других косвенныхрежимов адресации.
Сопоставление логических адресов с физической и виртуальной памятью также добавляет несколько уровней косвенности; см. ниже.
Многие программисты предпочитают адресовать память таким образом, чтобы не было различий между пространством кода и пространством данных (см. выше), а также между физической и виртуальной памятью (см. выше) — другими словами, численно идентичные указатели ссылаются на один и тот же байт оперативной памяти.
Однако многие ранние компьютеры не поддерживали такую плоскую модель памяти — в частности, машины с архитектурой Гарварда заставляют хранить программы полностью отдельно от хранения данных. Многие современные DSP (например, Motorola 56000 ) имеют три отдельные области хранения — хранение программ, хранение коэффициентов и хранение данных. Некоторые часто используемые инструкции извлекаются из всех трех областей одновременно — меньшее количество областей хранения (даже если бы было то же самое общее количество байтов хранения) заставило бы эти инструкции работать медленнее.
Ранние процессоры x86 использовали сегментированную модель адресов памяти, основанную на комбинации двух чисел: сегмента памяти и смещения внутри этого сегмента.
Некоторые сегменты неявно рассматриваются как сегменты кода , выделенные для инструкций , сегменты стека или обычные сегменты данных . Хотя использование отличается, сегменты не имеют различных защит памяти, отражающих это. В плоской модели памяти все сегменты (регистры сегментов) обычно устанавливаются в ноль, и только смещения являются переменными.
В 360/65 и 360/67 IBM представила концепцию, известную как префикс. [2] Префикс — это уровень преобразования адресов, который применяется к адресам в реальном режиме и к адресам, генерируемым динамической трансляцией адресов, с использованием уникального префикса, назначаемого каждому ЦП в многопроцессорной системе. В 360/65, 360/67 и каждом последующем до z/Architecture он логически меняет местами 4096-байтовый блок памяти с другим блоком, назначенным ЦП. В z/Architecture [3] префикс работает с 8196-байтовыми блоками. IBM классифицирует адреса в этих системах следующим образом: [4]
На моделях 360/65, S/370 без DAT и при работе с отключенной трансляцией имеется только плоское реальное адресное пространство и плоское абсолютное адресное пространство.
На 360/67, S/370 и последующих моделях вплоть до S/390 при работе с включенной трансляцией адреса содержат номер сегмента, номер страницы и смещение. Хотя ранние модели поддерживали как 2 КиБ, так и 4 КиБ размеры страниц, более поздние модели поддерживали только 4 КиБ. Позже IBM добавила инструкции для перемещения данных между первичным адресным пространством и вторичным адресным пространством.
S/370-XA добавил 31-битные адреса, но сохранил иерархию сегмент/страница/смещение со страницами по 4 КиБ.
В ESA/370 добавлено 16 регистров доступа (AR) и режим управления доступом AR, в котором 31-битный адрес транслировался с использованием адресного пространства, назначенного выбранным AR.
z/Architecture поддерживает 64-битные виртуальные, реальные и абсолютные адреса с многоуровневыми таблицами страниц.
перемещения применяется к первым 4096 байтам памяти. Эта область содержит все постоянные назначения памяти и, как правило, имеет особое значение для программ управления. Перемещение выполняется путем вставки 12-битного префикса в каждый адрес, в котором старшие 12 бит установлены на ноль и, следовательно, относятся к местоположению 0-4095.
Префикс обеспечивает возможность назначения блока реальных адресов, содержащих назначенные ячейки памяти, другому блоку в абсолютной памяти для каждого ЦП, что позволяет нескольким ЦП, совместно использующим основную память, работать одновременно с минимальными помехами, особенно при обработке прерываний.