Адресация памяти

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 17:12, 2 июля 2017.

Адрес памяти (англ. Memory adress) - это понятие данных, используемых программно-аппаратными средствами для получения доступа к требуемому участку памяти компьютера. Адрес памяти представляет собой последовательность цифр фиксированной длины, которые, обычно, отображаются и обрабатываются как целые числа. Причиной такой формы записи являются особенности CPU (такие как программный счетчик и возрастающие регистры адреса(ячейки) памяти), а также использование памяти как массива, поддерживаемого различными языками программирования.

Типы адресов памяти

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

Память цифрового компьютера (или основная память) состоит из множества ячеек памяти, каждая из которых имеет физический адрес.[Источник 1] - код, который центральный процессор (или другое устройство) может использовать для доступа к ней. Как правило, только системное программное обеспечение, то есть BIOS[Источник 2], операционные системы, и некоторые специализированные вспомогательные программы (например, тестеры памяти), обращаются к физической памяти с использованием операторов машинного кода и регистров процессора, Инструктируя CPU направлять аппаратное устройство, называемое контроллером памяти, использовать шину памяти или системную шину или отдельные управляющие, адресные и информационные шины для выполнения команд программы. Шина контроллеров памяти состоит из нескольких параллельных линий, каждая из которых представлена двоичной цифрой (бит). Ширина шины и, следовательно, количество адресуемых единиц хранения и количество битов в каждой единице варьируется среди компьютеров. Физический адрес - это конечный результат всех преобразований других типов адресов, перечисленных далее. На нём кончается работа внутри центрального процессора по преобразованию адресов.

Эффективные адреса

Эффективный адрес — это начало пути вычисления физического адреса. Он задаётся в аргументах индивидуальной машинной инструкции, и вычисляется из значений регистров, смещений и масштабирующих коэффициентов, заданных в ней явно или неявно.

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

Без знания номера и параметров сегмента, в котором указан эффективный адрес, последний бесполезен. Сам сегмент выбирается ещё одним числом, именуемым селектором. Пара чисел, записываемая как selector:offset, получила имя логический адрес. Так как активные селекторы хранятся в группе специальных регистров, чаще всего вместо первого числа в паре записывается имя регистра, например, ds:0x11223344[Источник 3]. В старых компьютерах логические и физические адреса были согласованы, но с момента появления виртуальной памяти у большинства прикладных программ нет информации о физических адресах. Скорее, они адресуют логические адреса[Источник 4] или виртуальные адреса, используя блок управления памятью компьютера и отображение памяти операционной системы.

Линейные адреса

Эффективный адрес — это смещение от начала сегмента — его базы. Если сложить базу и эффективный адрес, то получим число, называемое линейным адресом:

lin_addr = segment.base + eff_addr

Преобразование логический → линейный не всегда может быть успешным, так как при его исполнении проверяется несколько условий на свойства сегмента, записанных в полях его дескриптора. Например, проверяется выход за границы сегмента и права доступа.

Виртуальные адреса

В литературе и в документации других архитектур встречается ещё один термин — виртуальный адрес. Он не используется в документации Intel на IA-32, однако встречается, например, в описании Intel® Itanium, в котором сегментация не используется. Можно смело считать, что для IA-32 виртуальный == линейный. В советской литературе по вычислительной технике этот вид адресов также именовался математическим.

Единица измерения адреса

Большинство современных компьютеров используют байтовую адресацию, причем каждый адрес идентифицирует один 8-разрядный байт памяти; данные, слишком большие чтобы храниться в одном байте, могут находиться в нескольких байтах, образуя последовательность последовательных адресов. Существуют компьютеры с пословной адресацией, где минимальным адресуемым блоком памяти является слово на процессоре. Например, миникомпьютер Data General Nova и микросхемы Texas Instruments TMS9900 и National Semiconductor IMP-16 использовали 16-битные слова, также было много 36-разрядных универсальных компьютеров (например, PDP-10), которые использовали 18-разрядную пословную адресацию, а не байт-адресацию, предоставляя адресное пространство из 218 36-битных слов (приблизительно 1 мегабайт памяти). Эффективность адресации памяти зависит от размера бита шины, используемой для адресации - чем больше бит, тем больше адресов доступно компьютеру. Например, 8-разрядный адресный компьютер с 20-разрядной адресной шиной (например, Intel 8086) может адресовать 220 (1 048 576) ячеек памяти или один MB памяти, тогда как 32-разрядная шина (например, Intel 80386) Адреса 232 (4 294 967 296) или 4 ГБ адресного пространства. Напротив, 36-разрядный адресно-адресуемый аппарат с 18-разрядной адресной шиной адресует только 218 (262,144) 36-разрядных местоположений (9,437,184 бита), что эквивалентно 1,179,648 8-битным байтам или 1152 КБ.

Некоторые старые компьютеры (десятичные компьютеры) были десятизначными с цифровой адресацией. Например, каждый адрес в магнитной памяти IBM 1620 идентифицировал одну шестиразрядную двоично-кодированную десятичную цифру, состоящую из бита четности, бита флага и четырех числовых битов. В 1620 использовались пятизначные десятичные адреса, поэтому в теории максимально возможный адрес был 99,999. На практике CPU поддерживал 20000 ячеек памяти и мог добавить до двух дополнительных модулей внешней памяти, каждый из которых поддерживает 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 гибибайта (GB). Это позволяет эффективно хранить адрес памяти одним словом.

Однако это не всегда выполняется. Компьютеры могут иметь адреса памяти, большие или меньшие, чем размер их слова. Так многие 8-разрядные процессоры, например MOS Technology 6502, поддерживают 16-разрядные адреса, а если бы они их не поддерживали, то они были бы ограничены лишь 256 байтами адресной памяти. 16-разрядные процессоры Intel 8088 и Intel 8086 поддерживают 20-разрядную адресацию через сегментацию, что позволяет им получать доступ к 1 Мбайт, а не 64 Кбайт памяти. Все процессоры Intel Pentium, начиная с Pentium Pro, включают в себя расширения физических адресов (PAE[Источник 5]), которые поддерживают отображение 36-разрядных физических адресов в 32-разрядные виртуальные адреса.

Теоретически современные 64-разрядные компьютеры с байтовой адресацией могут адресовать 264 байта, но на практике объем памяти ограничен процессором, контроллером памяти или особенностями печатной платы (например, количеством разъемов физической памяти или количеством паяемой памяти).

Содержание отдельной ячейки памяти

Каждая ячейка памяти на компьютере с хранимой программой хранит двоичное число или десятичное число некоторого типа. Эти числа определяются как данные или как команды, а их использование определяется командами, которые извлекают и взаимодействуют с ними. Некоторые «ранние» программисты сочетали команды и данные в словах как способ сэкономить память: «Манчестер-Марк-1» имел место в своих 40-битных словах для хранения нескольких бит данных - его процессор игнорировал небольшую секцию в середине слова - и это часто использовалось как эксплойт для хранения дополнительных данных. Самовоспроизводящиеся программы, такие как вирусы, иногда рассматривают себя как данные, а иногда как команды. Самовоспроизводящийся код в настоящее время устаревает, поскольку его тестирование и техническое обслуживание непропорционально сложно для экономии нескольких байт, а также он может выдавать неверные результаты из-за предположений компилятора или процессора относительно состояния машины, но все же он иногда используется намеренно, с большой осторожностью.


Адресное пространство в программировании приложений

В современной многозадачной среде процессы приложений обычно имеют в своем адресном пространстве (или пространствах) куски памяти следующих типов:

  • Машинный код, в том числе:
    • Собственный код программы;
    • Совместно используемые библиотеки.
  • Данные, в том числе:
    • Инициализированные данные;
    • Неинициализированные (но выделенные) переменные;
    • Стек для переменных исполняемой программы;
    • Куча;
    • Совместно используемая память и отображенные в память файлы.

Некоторые части адресного пространства могут вообще не отображаться.

Схемы адресации

Компьютерная программа может обращаться к адресу, указанному явным образом - в низкоуровневом программировании его обычно называют абсолютным адресом или иногда конкретным адресом, он известен как указатель в языках более высокого уровня. Но программа также может использовать относительный адрес, который указывает местоположение по отношению к другому месту (базовому адресу). Также существует много других способов косвенной адресации.

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

Многие программисты предпочитают адресовать память таким образом, чтобы не было различий между пространством кода и пространством данных, а также физической и виртуальной памятью, другими словами, численно идентичные указатели относятся к точно одному и тому же байту ОЗУ.

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

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

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

См. также

Источники

  1. Физический адрес // Википедия. Дата обновления: 18.03.2017. Url:https://en.wikipedia.org/wiki/Physical_address/ (дата обращения: 19.06.2017)
  2. BIOS // Википедия. Дата обновления: 29.05.2017. Url:https://en.wikipedia.org/wiki/BIOS/ (дата обращения 19.06.2017)
  3. Адреса памяти // Хабрахабр. Url:https://habrahabr.ru/company/intel/blog/238091/ (дата обращения 08.06.2017)
  4. Логический адрес // Википедия. Дата обновления: 16.09.2016. Url:https://en.wikipedia.org/wiki/Logical_address/ (дата обращения 19.06.2017)
  5. Физический адрес // Википедия. Дата обновления: 18.06.2017. Url:https://en.wikipedia.org/wiki/Physical_Address_Extension/ (дата обращения 19.06.2017)