Виртуальные логические адреса это адреса соответствующие номерам ячеек оперативной памяти

Обновлено: 06.07.2024

физический адрес - когда процессор находится в системном режиме, адрес, используемый процессором, является физическим адресом.

логический адрес-когда процессор находится в пользовательском режиме, используемый адрес является логическим адресом. они в любом случае сопоставлены с некоторым физическим адресом путем добавления Базового регистра со значением смещения.Это в некотором роде обеспечивает защиту памяти.

Я столкнулся с дискуссией о том, что виртуальные и логические адреса/адресное пространство одинаковы. Это правда?

любая помощь будет высоко оценили.

мой ответ верен для процессоров Intel, работающих в современной системе Linux, и я говорю о процессах пользовательского уровня, а не о коде ядра. Тем не менее, я думаю, что это даст вам достаточно понимания, чтобы подумать о других возможностях

Типы Адресов

относительно вопроса 3:

Я столкнулся с дискуссией, что виртуальный и логический адреса / адресное пространство одинаковы. Это правда?

насколько я знаю они одинаковы, по крайней мере, в современных ОС, работающих поверх процессоров Intel.

позвольте мне попытаться определить два понятия, прежде чем я больше объяснять:

  • Физический Адрес: адрес, где что-то физически находится в чипе ОЗУ.
  • Логический/Виртуальный Адрес: адрес, который ваша программа использует для достижения своих вещей. Он обычно преобразуется в физический адрес позже аппаратным чипом (в основном, даже не CPU действительно знает об этом преобразовании).

Виртуальный/Логический Адрес

виртуальный адрес-это хорошо, виртуальный адрес, ОС вместе с аппаратной схемой, называемой MMU(блок управления памятью), обманывают вашу программу, что она работает одна в системе, у нее есть все адресное пространство (наличие 32-битной системы означает, что ваша программа будет думать, что у нее есть 4 Гб ОЗУ; грубо говоря).

очевидно, если у вас есть более одной программы, запущенной на время (вы всегда делаете, GUI, процесс инициализации, оболочка, приложение часов, календарь, что угодно), это не сработает.

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

пример: ваш процесс может иметь переменную с именем (counter), которая задана виртуальным адресом 0xff (imaginably. ) и другая переменная с именем (oftenNotUsed), которому задан виртуальный адрес (0xaa).

Если Вы читаете сборку вашего скомпилированного кода после того, как все ссылки произошли, вы будете обращаться к ним с помощью этих адресов, но хорошо, переменная (oftenNotUsed) не будет действительно там в ОЗУ в 0xaa, она будет на жестком диске, потому что вы ее не используете.

более того, переменная (счетчик), вероятно, не будет физически в (0xff), она будет где-то еще в ОЗУ, когда ваш процессор попытается получить то, что находится в 0xff, MMU и часть ОС сделают сопоставление и получат эту переменную, откуда она действительно доступна в ОЗУ, вы даже не заметите, что ее не было в 0xff.

теперь, что произойдет, если ваша программа запрашивает переменную (oftenNotUsed)? MMU + OS заметит этот "промах" и получит его для вас с жесткого диска в ОЗУ, а затем передаст его вам, как если бы он был в адресе (0xaa); эта выборка означает, что некоторые данные, которые присутствовали в ОЗУ, будут отправлены обратно в ОЗУ Жесткий диск.

теперь представьте, что это работает для каждого процесса в системе. Все думают, что у них есть 4 ГБ ОЗУ, никто на самом деле этого не имеет, но все работает, потому что у всех есть некоторые части их программы, Доступные физически в ОЗУ, но большая часть программы находится на жестком диске. Не путайте эту часть памяти программы, помещаемой в HD, с данными программы, которые вы можете получить через файловые операции.

резюме

виртуальный адрес: адрес, который вы используете в своих программах, адрес, который ваш процессор использует для извлечения данных, не является реальным и переводится через MMU на какой-то физический адрес; у каждого есть один, и его размер зависит от вашей системы(Linux под управлением 32-бит имеет адресное пространство 4 ГБ)

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

все, что я упомянул выше, хотя это упрощенная версия всей концепции, это то, что называется частью управления памятью компьютерной системы.

последствия этой системы

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

физический адрес - когда процессор находится в системном режиме, адрес, используемый процессором, является физическим адресом.

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

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

логические адреса не обязательно применяются исключительно к пользовательскому режиму. На процессорах x86 они также существуют в режиме ядра.

я столкнулся с обсуждением того, что виртуальные и логические адреса / адресное пространство одинаковы. Это правда?

Это зависит от конкретного процессора. х86 Процессоры можно настроить таким образом, чтобы сегменты не использовались явно. Они используются неявно, а их базы всегда равны 0 (за исключением сегментов локального хранилища потоков). При удалении селектора сегментов из логического адреса остается 32-разрядное (или 64-разрядное) смещение, значение которого совпадает с 32-разрядным (или 64-разрядным) виртуальным адресом. В этой упрощенной настройке вы можете считать, что они одинаковы или что логических адресов не существует. Это не так, но для большинства практических целей, достаточно хорошее приближение.

разница между логическим и виртуальным адресом

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

селектор сегментов - это 16-битное поле, из которого первым 13-битным является индекс (который является указателем на дескриптор сегмента находится в GDT, описанном ниже), поле 1 бит TI ( TI = 1 , см. LDT, TI=0 см. GDT)

Так для каждого логического адреса, виртуальный адрес вычисляется с помощью ниже лестница.

1) исследует поле TI селектора сегмента, чтобы определить, какой дескриптор В таблице хранится дескриптор сегмента. Это поле указывает, что дескриптор либо в GDT (в этом случае блок сегментации получает базовую линейную адрес GDT из регистра gdtr) или в активном LDT (в этом случае блок сегментации получает базовый линейный адрес этого LDT из регистра ldtr).

2) вычисляет адрес дескриптора сегмента из поле индекса сегмента Селектор. Поле индекса умножается на 8 (размер дескриптора сегмента), и результат добавляется к содержимому регистра gdtr или ldtr.

3) добавляет смещение логического адреса в поле дескриптора сегмента , таким образом, получение линейного(виртуального) адреса.

теперь это работа блока разбиения на страницы для перевода физического адреса с виртуального адреса.

см.: понимание ядра linux, глава 2 Адресация Памяти

физический адрес-это адрес, который отображается блоком памяти, т. е. загружается в регистр адресов памяти. Логический адрес-это адрес, который генерируется процессором. Пользовательская программа никогда не сможет увидеть реальный физический адрес.Блок сопоставления памяти преобразует логический адрес в физический адрес. Логический адрес, созданный пользовательским процессом, должен быть сопоставлен с физической памятью перед их использованием.

логическая память относительно соответствующей программы i.e (начальная точка программы + смещение)

Виртуальная память использует таблицу страниц, которая сопоставляется с ОЗУ и диском. Таким образом, каждый процесс может обещать больше памяти для каждого процесса.

в Usermode или UserSpace все адреса, видимые программой, являются виртуальными адресами. Когда в режиме ядра адреса, видимые ядром, по-прежнему виртуальны, но называются логическими, поскольку они равны физическому + pageoffset . Физические адреса-это те, которые видит RAM . С виртуальной памятью каждый адрес в программе проходит через таблицы страниц.

когда вы пишете небольшую программу, например:

/readelf-это команда для понимания объектных файлов и файла executabe, которые будут в 0s и 1s. вывод записывается в readelf_onj.текстовый файл/

/* В разделе "заголовок" вы увидите .данные.текст.разделы rodata вашего объектного файла. каждый начальный или базовый адрес запускается с 0000 и растет до соответствующего размера, пока не достигнет размера под заголовком "размер" - - - - > это логический адрес.*/

/ * здесь базовый адрес всех разделов не равен нулю. он будет начинаться с конкретного адреса и заканчиваться конкретным адресом. Компоновщик будет давать непрерывные адреса всем разделам (см. В readelf_exe.txt-файл. соблюдать базовый адрес и размер каждого раздела. Они начинаются непрерывно), поэтому отличаются только базовые адреса.--- >это называется виртуальное адресное пространство.*/

физический адрес-> в память будет иметь физический адрес. при загрузке исполняемого файла в память он будет иметь физический адрес. Фактически виртуальные адреса сопоставляются с физическими адресами для выполнения.

виртуальные адреса пользователя Это обычные адреса, видимые пользовательскими космическими программами. Адреса пользователей имеют длину 32 или 64 бита в зависимости от базовой аппаратной архитектуры, и каждый процесс имеет собственное виртуальное адресное пространство.

физический адрес Адреса используются между процессором и памятью системы. Физические адреса являются 32-или 64-разрядными величинами; даже 32-разрядные системы могут использовать 64-разрядные физические адреса в некоторых положения.

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

логические адреса ядра Они составляют нормальное адресное пространство ядра. Эти адреса отображают большую часть или всю основную память и часто рассматриваются как физические адреса. В большинстве архитектур логические адреса и связанные с ними физические адреса отличаются только постоянным смещением. Логические адреса используют собственный размер указателя оборудования и, таким образом, могут быть неспособны адресовать всю физическую память на хорошо оснащенных 32-разрядных системах. Логические адреса обычно хранятся в переменных типа unsigned long или void *. Память вернулась из то резервируется память вызовом kmalloc имеет логический адрес.

виртуальные адреса ядра Они отличаются от логических адреса в том, что они не обязательно имеют прямое сопоставление с физическими адресами. Все логические адреса являются виртуальными адресами ядра; память, выделенная vmalloc, также имеет виртуальный адрес (но без прямого физического сопоставления). Функция kmap возвращает виртуальные адреса. Виртуальные адреса обычно хранятся в переменных указателя.

Если у вас есть логический адрес, макрос __pa() (определенный в ) вернет свой связанный физический адрес. Физические адреса могут быть сопоставлены логические адреса с __va (), но только для страниц с низкой памятью.

Логический адрес — это термин, используемый в документации фирмы Intel для обозначения адреса ячейки памяти с точки зрения программиста. Логический адрес в 16- и 32-разрядном режимах состоит из двух компонентов: селектора сегмента и смещения. Однако в 64-разрядном режиме логический адрес состоит только из смещения, поскольку сегментная организация памяти в этом случае не используется.

Селектор сегмента

Селектор сегмента всегда является 16-разрядной величиной и хранится в сегментном регистре. Какой именно из сегментных регистров процессора содержит селектор для данного доступа к памяти, зависит от характера доступа. Так, если производится выборка кода команды, селектор будет находиться в регистре CS, если осуществляется неявный доступ к стеку — в регистре SS; эти два сегментных регистра не могут быть переопределены. Доступ к данным обычно осуществляется с использованием селектора в регистре DS, хотя с помощью префикса замены сегмента можно указать любой другой сегментный регистр. В строковых операциях MOVS, CMPS и STOS, а также команде потокового ввода INS один (или единственный) операнд использует значение селектора из регистра ES, который не может быть переопределён. При явных доступах к стеку (когда в качестве базового регистра используется ESP/ESP или BP/EBP/EBP) обычно используется сегментный регистр SS, однако, в отличие от неявных доступов, он может быть заменён на другой с помощью префикса замены сегмента.

В 64-разрядном режиме могут использоваться только сегментные регистры FS и GS, однако в этом случае они выступают в роли дополнительных базовых регистров, поскольку сегментация в этом режиме отключена.

Смещение

Смещение является вторым компонентом логического адреса. Его размер зависит от текущего режима работы процессора и может составлять 16, 32 или 64 бита.

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

В случае неявного обращения к памяти (например, при выборке кода очередной команды или при чтении или записи размещённого в стеке операнда команд PUSH и POP) смещение определяется процессором автоматически в соответствии со смыслом выполняемой операции. Например, при выборке кода команды смещением является содержимое регистра IP/EIP/RIP, а при доступе к вершине стека — содержимое регистра SP/ESP/RSP.

Логические и виртуальные адреса

Общепринятым термином для обозначения адресов, с которыми прямо работает программа, является «виртуальный адрес». Однако особенности операционных систем, предназначенных для архитектуры IA-32, накладывают на его понимание свой отпечаток. Поскольку все популярные системы, включая Windows и Linux, используют механизм сегментации в минимально необходимой степени, программы работают в плоском адресном пространстве при неизменных значениях селекторов сегментов, загруженных в сегментные регистры операционной системой при запуске программы. Таким образом, программы (и программисты) фактически имеют дело лишь со смещениями. Документация на операционные системы, говоря, например, о передаче параметров системным сервисам, применяет термин «виртуальный адрес» в тех случаях, когда фактически происходит передача смещения. Таким образом, можно считать, что в популярных ОС виртуальные адреса равны смещениям из состава логических адресов. Численно они будут равны линейным адресам, однако считать виртуальные и линейные адреса эквивалентными некорректно, поскольку программа имеет прямой доступ к виртуальным адресам, в то время как линейные существуют лишь внутри процессора и для программы совершенно недоступны.

Главная задача компьютерной системы – выполнять программы. Программы вместе с данными, к которым они имеют доступ , в процессе выполнения должны (по крайней мере частично) находиться в оперативной памяти . Операционной системе приходится решать задачу распределения памяти между пользовательскими процессами и компонентами ОС. Эта деятельность называется управлением памятью. Таким образом, память ( storage , memory ) является важнейшим ресурсом, требующим тщательного управления. В недавнем прошлом память была самым дорогим ресурсом.

Часть ОС, которая отвечает за управление памятью , называется менеджером памяти.

Физическая организация памяти компьютера

Запоминающие устройства компьютера разделяют, как минимум, на два уровня: основную (главную, оперативную , физическую ) и вторичную (внешнюю) память.

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

Вторичную память (это главным образом диски) также можно рассматривать как одномерное линейное адресное пространство , состоящее из последовательности байтов. В отличие от оперативной памяти , она является энергонезависимой, имеет существенно большую емкость и используется в качестве расширения основной памяти .

Эту схему можно дополнить еще несколькими промежуточными уровнями, как показано на рис. 8.1. Разновидности памяти могут быть объединены в иерархию по убыванию времени доступа, возрастанию цены и увеличению емкости.

Многоуровневую схему используют следующим образом. Информация, которая находится в памяти верхнего уровня, обычно хранится также на уровнях с большими номерами. Если процессор не обнаруживает нужную информацию на i-м уровне, он начинает искать ее на следующих уровнях. Когда нужная информация найдена, она переносится в более быстрые уровни.

Локальность

Оказывается, при таком способе организации по мере снижения скорости доступа к уровню памяти снижается также и частота обращений к нему.

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

Свойство локальности (соседние в пространстве и времени объекты характеризуются похожими свойствами) присуще не только функционированию ОС, но и природе вообще. В случае ОС свойство локальности объяснимо, если учесть, как пишутся программы и как хранятся данные, то есть обычно в течение какого-то отрезка времени ограниченный фрагмент кода работает с ограниченным набором данных. Эту часть кода и данных удается разместить в памяти с быстрым доступом. В результате реальное время доступа к памяти определяется временем доступа к верхним уровням, что и обусловливает эффективность использования иерархической схемы. Надо сказать, что описываемая организация вычислительной системы во многом имитирует деятельность человеческого мозга при переработке информации. Действительно, решая конкретную проблему, человек работает с небольшим объемом информации, храня не относящиеся к делу сведения в своей памяти или во внешней памяти (например, в книгах).

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

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

Логическая память

Аппаратная организация памяти в виде линейного набора ячеек не соответствует представлениям программиста о том, как организовано хранение программ и данных. Большинство программ представляет собой набор модулей, созданных независимо друг от друга. Иногда все модули, входящие в состав процесса, располагаются в памяти один за другим, образуя линейное пространство адресов. Однако чаще модули помещаются в разные области памяти и используются по-разному.

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

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


Рис. 8.2. Расположение сегментов процессов в памяти компьютера

Некоторые сегменты , описывающие адресное пространство процесса, показаны на рис. 8.2. Более подробная информация о типах сегментов имеется в лекции 10.

Большинство современных ОС поддерживают сегментную организацию памяти. В некоторых архитектурах (Intel, например) сегментация поддерживается оборудованием.

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

Связывание адресов

Итак логические и физические адресные пространства ни по организации, ни по размеру не соответствуют друг другу. Максимальный размер логического адресного пространства обычно определяется разрядностью процессора (например, 2 32 ) и в современных системах значительно превышает размер физического адресного пространства . Следовательно, процессор и ОС должны быть способны отобразить ссылки в коде программы в реальные физические адреса, соответствующие текущему расположению программы в основной памяти . Такое отображение адресов называют трансляцией (привязкой) адреса или связыванием адресов (см. рис. 8.3).

Связывание логического адреса, порожденного оператором программы, с физическим должно быть осуществлено до начала выполнения оператора или в момент его выполнения. Таким образом, привязка инструкций и данных к памяти в принципе может быть сделана на следующих шагах [Silberschatz, 2002].

Содержание

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

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

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

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

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

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

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

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

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

lin_addr = segment.base + eff_addr

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

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

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

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

Некоторые старые компьютеры (десятичные компьютеры) были десятизначными с цифровой адресацией. Например, каждый адрес в магнитной памяти 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). Это позволяет эффективно хранить адрес памяти одним словом.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Читайте также: