8

Я читал, что «Когда программа выполняет инструкцию типа: MOV REG,1000, она делает это, чтобы скопировать содержимое адреса памяти 1000 в REG. Адрес может быть сгенерирован с использованием индексирования, базовых регистров, сегментные регистры и другие способы.Общие сведения об виртуальном адресе и виртуальном адресном пространстве

Эти сгенерированные программой адреса называются виртуальными адресами и образуют виртуальное адресное пространство ».

Может кто-нибудь объяснить мне, что это такое (Эти сгенерированные программой адреса называются виртуальными адресами) означает?

ответ

27

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

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

Существует несколько способов, с помощью которых ЦП может получить адрес (помните, адрес - это всего лишь число). Число, представляющее адрес, может быть в регистре, оно может быть сохранено в другом месте памяти, оно может быть рассчитано путем добавления или вычитания смещения в регистр и т. Д. Во всех случаях ваша скомпилированная программа инструктирует CPU о том, как придумать (или генерировать) адрес, который он должен читать или писать.

Современные архитектуры позволяют запускать несколько программ, как будто они владеют всем логическим адресным пространством. Другими словами, несколько программ могут записывать в ячейку памяти по тому же адресу, не перешагивая результаты друг друга. Это делается путем виртуализации адресного пространства: скажем, программы A и B генерируют запись в ячейку памяти в 0x1000. ЦПУ, которому управляет операционная система, может выполнять дополнительные корректировки по адресу, а - карта - - физический адрес 0x60001000 для программы A и 0x5F001000 для программы B. Обе программы считают, что они написали местоположение в 0x1000 , поскольку они работают в виртуальном адресном пространстве. Их модель памяти - это непрерывный блок, начинающийся с 0 и продолжающийся до 0x000100000000 (при условии, что ваша система имеет 4GiB памяти, доступную для процессов). Но эта модель работает только потому, что CPU дополнительно переводит свои логические адреса на физические адреса, которые выделяются и отбираются по мере необходимости в процессе запуска программы.

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

+0

В вашем примере 0x1000 - это сгенерированный программой адрес? –

+0

@ program-o-steve Да, это сгенерированный программой адрес.Обратите внимание, что это не имеет значения, как * программа сгенерировала этот адрес: это может быть адрес статической переменной, элемент 0 массива по адресу 0x1000, элемент 32 массива по адресу 0x0FE0 и т. Д. , – dasblinkenlight

+0

, но заявление в моем вопросе говорит, что сгенерированный программой адрес является виртуальным адресом. 0x1000 не представляется виртуальным адресом –

1

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