Эта статья требует дополнительных ссылок для проверки . ( февраль 2018 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
В вычислениях , A адрес памяти является ссылкой на конкретные памяти местоположение , используемом на различных уровнях программного обеспечения и аппаратных средствами . Адреса памяти представляют собой последовательности цифр фиксированной длины, которые обычно отображаются и обрабатываются как целые числа без знака . Такая числовая семантика основана на особенностях ЦП (таких как указатель команд и регистры инкрементного адреса ), а также на использовании памяти, например массива, поддерживаемого различными языками программирования .
Типы [ править ]
Физические адреса [ править ]
А цифровая вычислительная машина «S основная память состоит из множества ячеек памяти . Каждая ячейка памяти имеет физический адрес, который представляет собой код. ЦП (или другое устройство) может использовать код для доступа к соответствующей ячейке памяти. Обычно только системное программное обеспечение , то есть BIOS , операционные системы и некоторые специализированные служебные программы (например, тестеры памяти ), адресуют физическую память с помощью операндов машинного кода или регистров процессора , инструктируя ЦП направить аппаратное устройство, называемое контроллером памяти , на использовать шину памяти илисистемная шина или отдельные шины управления , адреса и данных для выполнения команд программы. Шина контроллеров памяти состоит из ряда параллельных линий, каждая из которых представлена двоичной цифрой (битом). Ширина шины и, следовательно, количество адресуемых запоминающих устройств и количество битов в каждой единице различаются между компьютерами.
Логические адреса [ править ]
Компьютерная программа использует адрес памяти для выполнения машинного кода , а также для хранения и извлечения данных . В ранних компьютерах логические и физические адреса соответствовали друг другу, но с момента появления виртуальной памяти большинство прикладных программ не знали физических адресов. Скорее, они адресуют логические адреса или виртуальные адреса , используя блок управления памятью компьютера и отображение памяти операционной системы ; см. ниже .
Единица разрешения адреса [ править ]
Большинство современных компьютеров имеют байтовую адресацию . Каждый адрес идентифицирует один байт ( восемь бит ) памяти. Данные размером более одного байта могут храниться в последовательности последовательных адресов. Существуют компьютеры с адресной адресацией по словам , где минимальная адресуемая единица хранения - это слово процессора . Например, данные Общие Nova миникомпьютер , и Texas Instruments TMS9900 и 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 [ править ]
Ранние компьютеры x86 использовали адреса модели сегментированной памяти на основе комбинации двух чисел: сегмента памяти и смещения внутри этого сегмента.
Некоторые сегменты неявно рассматриваются как сегменты кода , предназначенные для инструкций , сегментов стека или обычных сегментов данных . Хотя способы использования различаются, сегменты не имеют разной защиты памяти, отражающей это. В модели с плоской памятью все сегменты (регистры сегментов) обычно устанавливаются в ноль, и только смещения являются переменными.
См. Также [ править ]
- Модель памяти (программирование)
- Выделение памяти
- Регистр адреса памяти
- Базовый адрес
- Смещение (информатика) , также известное как смещение
- Порядок байтов
- Блок управления памятью (MMU)
- Таблица страниц
- Защита памяти
- Сегментация памяти
- Язык программирования низкого уровня