виртуальный адрес это адрес

Виртуальные и физические адреса

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

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

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

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

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

Есть два принципиально разных ответа на этот вопрос.

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

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

Распределение памяти без использования виртуальных адресов

Источник

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

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

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

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

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

Преимущество ВП состоит в том, что объем ОЗУ не может быть увеличено ни

практически, ни теоретически. (Это попросту невозможно ни какими средствами

нельзя оптимизировать или преобразовать ячейки памяти, для того, чтобы, скажем,

помещать туда два бита информации вместо одного).

В настоящее время все множество реализаций виртуальной памяти может быть представлено тремя классами:

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

— сегментная виртуальная память предусматривает перемещение данных сегментами — частями виртуального адресного пространства произвольного размера, полученными с учетом смыслового значения данных (достоинства — «осмысленность» сегментов упрощает их защиту; недостатки — медленное преобразование адреса, высокий уровень фрагментации);

— сегментно-страничная виртуальная память сочетает достоинства обоих предыдущих подходов.

Источник

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

Виртуальный адрес — это адрес ячейки памяти с точки зрения программиста. Он может как совпадать, так и отличаться от физического адреса.

Виртуальный адрес в 32-разрядном режиме

В большинстве компьютерных архитектур виртуальный адрес является числом от нуля до некоего максимального значения, обычно определяемого разрядностью вычислительной машины, преобразуемым в физический адрес аппаратурой процессора. Архитектура IA-32 является одним из немногих исключений из этого правила. Во-первых, в программах используются сегментированные адреса, состоящие из 16-разрядного селектора сегмента и 32-разрядного смещения, т.е. адрес является не одним, а парой чисел. Во-вторых, фирма Intel не использует термин «виртуальный адрес», называя используемые в программах адреса логическими; таким образом, с точки зрения документации Intel, программист имеет дело именно с логическими адресами, а термин «виртуальный адрес» к архитектуре IA-32 вообще отношения не имеет. В-третьих, все операционные системы для архитектуры IA-32, поддерживающие механизм виртуальной памяти, а следовательно, оперирующие виртуальными адресами, пользуются механизмом сегментации IA-32 лишь в минимально необходимом объёме, предоставляя программам плоское адресное пространство, адресация внутри которого выполняется с помощью смещения, а селекторы сегментов остаются неизменными. Когда документация Windows или Linux говорит о передаче виртуальных адресов различным системным вызовам, во всех случаях передаётся только смещение из состава логического адреса.

Таким образом, можно считать, что термин «виртуальный адрес» применительно к 32-разрядным версиям распространённых ОС для платформы IA-32 является эквивалентом термина Intel «смещение, входящее в состав логического адреса для сегментов DS, SS, ES и CS» или другого, мало распространённого в реальной практике, но также используемого в документации Intel термина «эффективный адрес» (по отношению к тем же сегментам). Поскольку используется плоское адресное пространство с сегментами максимального размера (4 Гбайта), численно значение смещения (виртуального адреса) будет совпадать с линейным адресом, однако проводить знак равенства между терминами «виртуальный адрес» и «линейный адрес» некорректно, поскольку программист прямо работает именно с виртуальными адресами (в частности, передаёт их системным вызовам), а линейные адреса существуют лишь в глубинах процессора и для программиста недоступны в принципе.

Читайте также:  wot модули танков расположение

Что касается сегментов FS и GS, они используются нестандартным образом. В Windows FS фактически является отправной точкой для доступа к TEB (в пользовательском режиме), т.к. адрес TEB в качестве базового адреса загружен в дескриптор сегмента, селектор которого хранится в FS. Сам TEB является частью «общего» сегмента кода, стека и данных, доступного через сегментные регистры CS, SS, DS и ES, поэтому доступ к нему можно получить и через указанные регистры, указав правильное смещение. Адресация через GS для прикладных программ недоступна вообще.

Виртуальный адрес в 64-разрядном режиме

В 64-разрядном режиме сегментация упразднена, поэтому программист работает с адресами, состоящими лишь из одного 64-разрядного числа и численно совпадающими с линейными адресами. Однако и здесь архитектура IA-32 является исключением из общего правила: линейный, а значит, и виртуальный адрес (логический в документации Intel) адрес фактически является числом со знаком, поскольку требуется, чтобы они были «каноническими», т.е. чтобы все старшие биты адреса были равны либо нулю, либо единице в зависимости от значения самого старшего физически реализованного разряда адреса. Например, в первых 64-разрядных микропроцессорах архитектуры IA-32 физически реализованы не 64-разрядные, а 48-разрядные линейные адреса, которые должны находиться в пределах от 0000_0000_0000_0000h до 0000_7FFF_FFFF_FFFFh или от FFFF_8000_0000_0000h до FFFF_FFFF_FFFF_FFFFh, т.е. как числа со знаком лежать в пределах от –2**47 до +2**47–1.

Источник

Адреса памяти: физические, виртуальные, логические, линейные, эффективные, гостевые

Мне периодически приходится объяснять разным людям некоторые аспекты архитектуры Intel® IA-32, в том числе замысловатость системы адресации данных в памяти, которая, похоже, реализовала почти все когда-то придуманные идеи. Я решил оформить развёрнутый ответ в этой статье. Надеюсь, что он будет полезен ещё кому-нибудь.
При исполнении машинных инструкций считываются и записываются данные, которые могут находиться в нескольких местах: в регистрах самого процессора, в виде констант, закодированных в инструкции, а также в оперативной памяти. Если данные находятся в памяти, то их положение определяется некоторым числом — адресом. По ряду причин, которые, я надеюсь, станут понятными в процессе чтения этой статьи, исходный адрес, закодированный в инструкции, проходит через несколько преобразований.

На рисунке — сегментация и страничное преобразование адреса, как они выглядели 27 лет назад. Иллюстрация из Intel 80386 Programmers’s Reference Manual 1986 года. Забавно, что в описании рисунка есть аж две опечатки: «80306 Addressing Machanism». В наше время адрес подвергается более сложным преобразованиям, а иллюстрации больше не делают в псевдографике.

Начнём немного с конца — с цели всей цепочки преобразований.

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

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

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

Например, для инструкции (ассемблер в AT&T-нотации)

addl %eax, 0x11(%ebp, %edx, 8)

эффективный адрес операнда-назначения будет вычислен по формуле:

eff_addr = EBP + EDX * 8 + 0x11

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

Здесь обычно у тех, кто столкнулся с этими понятиями впервые, голова начинает идти кругом. Несколько упростить (или усложнить) ситуацию помогает тот факт, что почти всегда выбор селектора (и связанного с ним сегмента) делается исходя из «смысла» доступа. По умолчанию, если в кодировке машинной инструкции не сказано иного, для получения адресов кода используются логические адреса с селектором CS, для данных — с DS, для стека — с SS.

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

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

lin_addr = segment.base + eff_addr

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

Сегментация была модной на некотором этапе развития вычислительной техники. В настоящее она почти всюду была заменена другими механизмами, и используется только для специфических задач. Так, в режиме IA-32e (64-битном) только два сегмента могут иметь ненулевую базу. Для остальных четырёх в этом режиме всегда линейный адрес == эффективный.

Что такое виртуальный адрес?

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

Страничное преобразование

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

В разных режимах процессора различается число и ёмкость этих таблиц. Преобразование может завершиться неудачей, если очередная таблица не содержит валидных данных, или права доступа, хранящиеся в последней из них, запрещают доступ к странице; например, при записи в регионы, помеченные как «только для чтения», или попытке чтения памяти ядра из непривилегированного процесса.

Читайте также:  как узнать температуру утюга

Гостевой физический

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

Полная картина

Я попытался собрать все преобразования адреса в одну иллюстрацию. В ней преобразования обозначены стрелками, типы адресов обведены в рамки.

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

Заключение

Источник

Разница между адресом физической/логической/виртуальной памяти

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

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

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

9 ответов

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

Типы Адресов

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

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

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

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

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

виртуальный адрес-это хорошо, виртуальный адрес, ОС вместе с аппаратной схемой, называемой 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 ГБ)

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

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

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

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

Читайте также:  как принять участие в программе предварительной оценки windows 11

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

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

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

Я имею в виду ниже базу ответов на intel x86 CPU

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

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

теперь селектор сегмента или идентификатор сегмента say относится к сегменту кода или сегменту данных или сегменту стека и т. д. Linux содержит один GDT/LDT (Global / Local Descriptor Table), который содержит 8-байтовый дескриптор каждого сегмента и содержит базовый (виртуальный) адрес сегмента.

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

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

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

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

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

обычно каждый выданный адрес (для архитектуры x86) является логическим адресом, который преобразуется в линейный адрес через таблицы сегментов. После перевода в линейный адрес он затем переводится в физический адрес через таблицу страниц.
Хорошая статья, объясняющая то же самое в depth:
http://duartes.org/gustavo/blog/post/memory-translation-and-segmentation/

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Образовательный портал