В вычислениях, A адрес памяти является ссылкой на конкретные памяти местоположение, используемом на различных уровнях программного обеспечения и аппаратных средствами. Адреса памяти представляют собой последовательности цифр фиксированной длины, которые обычно отображаются и обрабатываются как целые числа без знака. Такая числовая семантика основана на особенностях ЦП (таких как указатель команд и регистры инкрементного адреса ), а также на использовании памяти, например массива, поддерживаемого различными языками программирования.
А цифровая вычислительная машина «S основная память состоит из множества ячеек памяти. Каждая ячейка памяти имеет физический адрес, который представляет собой код. ЦП (или другое устройство) может использовать код для доступа к соответствующей ячейке памяти. Как правило, только системное программное обеспечение, то есть BIOS, операционные системы и некоторые специализированные служебные программы (например, тестеры памяти ), адресуют физическую память с помощью операндов машинного кода или регистров процессора, инструктируя ЦП направить аппаратное устройство, называемое контроллером памяти, на использовать шину памяти или системную шину или отдельные шины управления, адреса и данных для выполнения команд программы. Шина контроллеров памяти состоит из ряда параллельных линий, каждая из которых представлена двоичной цифрой (битом). Ширина шины и, следовательно, количество адресуемых запоминающих устройств и количество битов в каждой единице различаются между компьютерами.
Компьютерная программа использует адрес памяти для выполнения машинного кода, а также для хранения и извлечения данных. В ранних компьютерах логические и физические адреса соответствовали друг другу, но с момента появления виртуальной памяти большинство прикладных программ не знали физических адресов. Скорее, они адресуют логические адреса или виртуальные адреса, используя блок управления памятью компьютера и отображение памяти операционной системы ; см. ниже.
Большинство современных компьютеров имеют байтовую адресацию. Каждый адрес идентифицирует один байт ( восемь бит ) памяти. Данные размером более одного байта могут храниться в последовательности последовательных адресов. Существуют компьютеры с адресной адресацией по словам, где минимальная адресуемая единица хранения - это именно слово процессора. Например, данные Общие Nova миникомпьютер, и инструменты TMS9900 Texas и National Semiconductor ИМП-16 микрокомпьютеры используются 16 - битных слов, и там было много 36-разрядных универсальных компьютеров (например, PDP-10 ), который используется 18-битное словом адресации, не байтовая адресация, дает адресное пространство из 2 18 36-битных слов, примерно 1 мегабайт памяти. Эффективность адресации памяти зависит от размера шины, используемой для адресов - чем больше битов используется, тем больше адресов доступно компьютеру. Например, машина с 8-битной адресацией байтов и 20-битной адресной шиной (например, Intel 8086 ) может адресовать 2 20 (1048 576) ячеек памяти или один мегабайт памяти, в то время как 32-битная шина (например, Intel 80386) ) адреса 2 32 (4 294 967 296) ячеек или адресное пространство 4 ГиБ. Напротив, машина с 36-битной адресацией слов с 18-битной адресной шиной адресует только 2 18 (262 144) 36-битных ячеек (9 437 184 бит), что эквивалентно 1179 648 8-битным байтам, или 1152 КиБ, или 1,125 МиБ - немного больше, чем у 8086.
Некоторые старые компьютеры (компьютеры с десятичным числом ) имели адрес с десятичной цифрой. Например, каждый адрес в IBM 1620 «S память на магнитных сердечниках идентифицирован один шесть бит двоично-десятичном разряд, состоящий из бита четности, бит флага и четыре цифровых битов. В 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-разрядными виртуальными адресами. Многие ранние процессоры имели по 2 адреса на слово, например 36-битные процессоры.
Теоретически современные 64-битные компьютеры с байтовой адресацией могут адресовать 2 64 байта (16 эксбибайт ), но на практике объем памяти ограничен ЦП, контроллером памяти или конструкцией печатной платы (например, количеством физических разъемы памяти или количество распаянной памяти).
Каждая ячейка памяти в хранящей программе компьютере имеет двоичное число или десятичное число некоторого вида. Его интерпретация как данные некоторого типа данных или как инструкция, и использование определяются инструкциями, которые извлекают их и манипулируют ими.
Некоторые ранние программисты объединили инструкции и данные в словах, чтобы сэкономить память, когда это было дорого: у Manchester Mark 1 было место в 40-битных словах для хранения небольших битов данных - его процессор игнорировал небольшой участок в середине одно слово - и это часто использовалось как дополнительное хранилище данных. Самовоспроизводящиеся программы, такие как вирусы, иногда воспринимают себя как данные, а иногда как инструкции. Самомодифицирующийся код, как правило, не рекомендуются в настоящее время, так как это делает тестирование и обслуживание несоразмерно трудно экономии нескольких байт, а также может дать неверные результаты из - за компилятор или предположений процессора о машинах состоянии, но до сих пор иногда используются намеренно, с большой осторожностью.
В современной многозадачной среде процесс приложения обычно имеет в своем адресном пространстве (или пробелах) блоки памяти следующих типов:
Некоторые части адресного пространства могут вообще не отображаться.
Некоторые системы имеют архитектуру «разделенной» памяти, где машинный код, константы и данные находятся в разных местах и могут иметь разный размер адреса. Например, микроконтроллеры PIC18 имеют 21-битный программный счетчик для адресации машинного кода и констант во флэш-памяти и 12-битные адресные регистры для адресации данных в SRAM.
Компьютерная программа может получить доступ к явно заданному адресу - в низкоуровневом программировании это обычно называется абсолютный адрес, а иногда иконкретный адрес, которыйв языках более высокого уровняизвестен кактип данных указателя. Но программа также может использовать относительный адрес, который указывает местоположение относительно другого места ( базовый адрес ). Есть еще много режимы косвенной адресации.
Сопоставление логических адресов с физической и виртуальной памятью также добавляет несколько уровней косвенности; см. ниже.
Многие программисты предпочитают адресовать память таким образом, чтобы не было различий между пространством кода и пространством данных (см. Выше), а также между физической и виртуальной памятью (см. Ниже) - другими словами, числовые идентичные указатели относятся к одному и тому же байту. оперативной памяти.
Однако многие ранние компьютеры не поддерживали такую модель плоской памяти - в частности, машины с гарвардской архитектурой заставляют хранилище программ быть полностью отделено от хранилища данных. Многие современные DSP (например, Motorola 56000 ) имеют три отдельных области хранения - программную память, память коэффициентов и память данных. Некоторые часто используемые инструкции извлекаются из всех трех областей одновременно - меньшее количество областей памяти (даже если бы было одинаковое общее количество байтов памяти) замедлило бы выполнение этих инструкций.
Ранние компьютеры x86 использовали адреса модели сегментированной памяти на основе комбинации двух чисел: сегмента памяти и смещения внутри этого сегмента.
Некоторые сегменты неявно рассматриваются как сегменты кода, предназначенные для инструкций, сегментов стека или обычных сегментов данных. Хотя способы использования различаются, сегменты не имеют разной защиты памяти, отражающей это. В модели с плоской памятью все сегменты (регистры сегментов) обычно устанавливаются в ноль, и только смещения являются переменными.
См. Также: Длинный режим.