Виртуальная память или физическая память
Предположим, мы пишем программу на C и печатаем адрес одной из переменных, объявленных в программе. Является ли адрес, который выводится на экран, виртуальным адресом или физическим адресом переменной? Если это виртуальный адрес, почему он все еще имеет тот же диапазон, что и битовый диапазон физической памяти? Например. для 32-битного компьютера, если он возвращает 0x833CA23E.
3 ответа
Адрес будет виртуальным адресом в виртуальной памяти, потому что приложение не знает физической памяти. Это скрыто ядром и MMU.
Я не уверен, что вы подразумеваете под тем же "битовым диапазоном". Если у вас есть 32-разрядное адресное пространство, оно будет охватывать все 32-разрядное пространство независимо от того, какой объем физической памяти у вас есть. Аналогично для 64-битных.
В большинстве типичных случаев (Windows, Linux и т. Д.) Это будет виртуальный адрес.
В типичных случаях, таких как Linux и Windows, как виртуальные, так и физические адреса обычно бывают 32-битными, поэтому наличие номеров в одном и том же диапазоне становится неизбежным. Можно выделить более 4 гигабайт памяти, и когда / если вы это сделаете, вы получите адреса размером более 32 бит - но если вы не предпримете специальных действий для этого, 32-битный адрес - это то, что вам нужно ". получу по умолчанию.
Когда вы используете более 4 ГБ памяти под 32-битной ОС, вы обычно делаете это через какой-то специальный API, например, Windows Window Addressing Extensions. Используя их, вы получаете доступ к более чем 4 ГБ ОЗУ, но это не то, что произойдет по умолчанию с кодом, который даже близок к переносимому.
Некоторые (версии некоторых) операционных систем также используют Intel Physical Address Extensions (PAE), чтобы дать системе в целом доступ к более чем 4 ГБ ОЗУ, но даже когда они используются, любой отдельный процесс, работающий в системе, по-прежнему ограничено адресацией 4 ГБ (т. е. с PAE вы можете иметь ограничение в 4 ГБ на процесс, в то время как в старых системах общее ограничение было 4 ГБ, разделенное по мере необходимости между процессами).
В большинстве случаев это будет 32-битный виртуальный адрес.
Если ваша ОС поддерживает пейджинг, то это будет виртуальный адрес. Он мог быть сопоставлен с одним и тем же физическим адресом с помощью подкачки. Linux и Windows делают пейджинг.
Другая вещь, которая имеет значение, это архитектура. В 32-битной системе Intel x86 это будет 32-битный адрес. Первые 10 бит адреса будут использоваться для получения таблицы страниц. Вторые 10 бит будут использованы для получения страницы из выбранной таблицы страниц. И последние 12 бит дадут вам фактический физический адрес с этой страницы.
Я надеюсь, что это отвечает на ваш вопрос.