ФЭНДОМ


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

Виртуальный адрес в 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 Гбайта), численно значение смещения (виртуального адреса) будет совпадать с линейным адресом, однако проводить знак равенства между терминами «виртуальный адрес» и «линейный адрес» некорректно, поскольку программист прямо работает именно с виртуальными адресами (в частности, передаёт их системным вызовам), а линейные адреса существуют лишь в глубинах процессора и для программиста недоступны в принципе.

Что касается сегментов 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.