В вычислительной технике виртуальное адресное пространство ( VAS ) или адресное пространство — это набор диапазонов виртуальных адресов, которые операционная система делает доступными для процесса. [1] Диапазон виртуальных адресов обычно начинается с нижнего адреса и может расширяться до самого высокого адреса, разрешенного архитектурой набора инструкций компьютера и поддерживаемого реализацией размера указателя операционной системы , который может составлять 4 байта для 32-разрядных или 8 байтов для 64-разрядных версий ОС. Это обеспечивает несколько преимуществ, одним из которых является безопасность за счет изоляции процесса, предполагая, что каждому процессу предоставлено отдельное адресное пространство .
При запуске нового приложения в 32-разрядной ОС процесс имеет VAS размером 4 ГиБ : каждый из адресов памяти (от 0 до 2 32 − 1) в этом пространстве может иметь один байт в качестве значения. Изначально ни один из них не имеет значений ('-' обозначает отсутствие значения). Использование или установка значений в таком VAS вызовет исключение памяти .
0 4 ГиБВАС |----------------------------------------------|
Затем исполняемый файл приложения отображается в VAS. Адреса в VAS процесса отображаются в байты в exe-файле. Операционная система управляет отображением:
0 4 ГиБВАС |---vvv----------------------------------------|отображение |||файл байты приложение
V — это значения из байтов в отображенном файле . Затем отображаются требуемые файлы DLLkernel32.dll
(включая пользовательские библиотеки, а также системные, такие как и user32.dll
):
0 4 ГиБВАС |---ввв--------вввввв---вввв-------------------|отображение ||| |||||| ||||файл байты приложение ядро пользователь
Затем процесс начинает выполнять байты в EXE-файле. Однако единственный способ, которым процесс может использовать или устанавливать значения '-' в своем VAS, — это попросить ОС сопоставить их с байтами из файла. Обычный способ использования памяти VAS таким образом — сопоставить ее с файлом подкачки . Файл подкачки — это один файл, но несколько отдельных наборов смежных байтов могут быть сопоставлены в VAS:
0 4 ГиБВАС |---ввв--------вввввв---вввв----вв---в----ввв--|отображение ||| |||||| |||| || || |||файл байты приложение ядро пользователь system_page_file
И разные части файла подкачки могут отображаться в VAS разных процессов:
0 4 ГиБВАС 1 |---вввв-------вввввв---вввв----вв---в----ввв--|отображение |||| |||||| |||| || || |||файл байты app1 app2 ядро пользователь system_page_fileотображение |||| |||||| |||| || |ВАС 2 |--------вввв--вввввв---вввв-------вв---в------|
В Microsoft Windows 32-bit по умолчанию только 2 GiB доступны процессам для их собственного использования. [2] Остальные 2 GiB используются операционной системой. В более поздних 32-битных редакциях Microsoft Windows можно расширить виртуальное адресное пространство пользовательского режима до 3 GiB , в то время как для виртуального адресного пространства режима ядра останется только 1 GiB/3GB
, если пометить программы как IMAGE_FILE_LARGE_ADDRESS_AWARE и включить переключатель в файле boot.ini. [3] [4]
В Microsoft Windows 64-bit в процессе, запускающем исполняемый файл, который был связан с /LARGEADDRESSAWARE:NO
, операционная система искусственно ограничивает часть пользовательского режима виртуального адресного пространства процесса до 2 GiB. Это применимо как к 32-, так и к 64-разрядным исполняемым файлам. [5] [6] Процессы, запускающие исполняемые файлы, которые были связаны с /LARGEADDRESSAWARE:YES
параметром, который является значением по умолчанию для 64-разрядной Visual Studio 2010 и более поздних версий, [7] имеют доступ к более чем 2 GiB виртуального адресного пространства: до 4 GiB для 32-разрядных исполняемых файлов, до 8 TiB для 64-разрядных исполняемых файлов в Windows через Windows 8 и до 128 TiB для 64-разрядных исполняемых файлов в Windows 8.1 и более поздних версиях. [4] [8]
Выделение памяти через malloc языка C устанавливает файл подкачки как резервное хранилище для любого нового виртуального адресного пространства. Однако процесс может также явно отображать байты файла.
Для процессоров x86 32-битная версия Linux позволяет разделять диапазоны адресов пользователя и ядра различными способами: 3G/1G пользователь/ядро (по умолчанию), 1G/3G пользователь/ядро или 2G/2G пользователь/ядро . [9]