В вычислениях, виртуальное адресное пространство (VAS ) или адресное пространство - это набор диапазонов виртуальных адресов, которые операционная система делает доступными для процесса. Диапазон виртуальных адресов обычно начинается с низкого адреса и может расширяться до самого высокого адреса, разрешенного архитектурой набора команд компьютера и поддерживаемого реализацией размера указателя операционной системы, которая может быть 4 байтов для 32-битных или 8 байтов для 64-битных версий ОС. Это дает несколько преимуществ, одно из которых - безопасность за счет изоляции процесса, если каждому процессу предоставляется отдельное адресное пространство .
Когда новое приложение выполняется в 32-битной ОС, процесс имеет 4 ГиБ VAS: каждый из адресов памяти (от 0 до 2 - 1) в этом пространстве может иметь в качестве значения один байт. Изначально ни у одного из них нет значений ('-' означает отсутствие значения). Использование или установка значений в таком VAS вызовет исключение памяти.
0 4 ГиБ VAS | -------------------------- -------------------- |
Затем исполняемый файл приложения отображается в VAS. Адреса в процессе VAS сопоставляются с байтами в exe-файле. ОС управляет отображением:
0 4 ГиБ VAS | --- vvvvvvv ----------------------------- ------- | отображение | ----- | file bytes app.exe
Значения v - это значения из байтов в сопоставленном файле. Затем сопоставляются требуемые файлы DLL (сюда входят как пользовательские библиотеки, так и системные, такие как kernel32.dllи user32.dll):
0 4 ГиБ VAS | --- vvvvvvv ---- vvvvvv --- vvvv ------------------- | отображение ||||||| |||||| |||| файл байтов app.exe пользователь ядра
Затем процесс начинает выполнение байтов в exe-файле. Однако единственный способ, которым процесс может использовать или устанавливать значения «-» в своем VAS, - это попросить ОС сопоставить их с байтами из файла. Распространенный способ использования памяти VAS таким образом - сопоставить ее с файлом подкачки . Файл подкачки - это один файл, но несколько отдельных наборов смежных байтов могут быть отображены в VAS:
0 4 ГиБ VAS | --- vvvvvvv ---- vvvvvv --- vvvv ---- vv --- v ---- vvv-- | отображение ||||||| |||||| |||| || | ||| файл байтов app.exe ядро пользователь system_page_file
И разные части файла подкачки могут отображаться в VAS разных процессов:
0 4 ГиБ VAS 1 | --- vvvv ---- --- vvvvvv --- vvvv ---- vv --- v ---- vvv-- | отображение |||| |||||| |||| || | ||| файл байтов app1 app2 ядро пользователь system_page_file сопоставление |||| |||||| |||| || | VAS 2 | -------- vvvv - vvvvvv --- vvvv ------- vv --- v ------ |
В 32-разрядной версии Microsoft Windows по умолчанию только 2 ГиБ доступны процессам для собственного использования. Остальные 2 ГиБ используются операционной системой. В более поздних 32-разрядных выпусках Microsoft Windows можно расширить виртуальное адресное пространство пользовательского режима до 3 ГиБ, в то время как для виртуального адресного пространства режима ядра остается только 1 ГиБ, пометив программы как IMAGE_FILE_LARGE_ADDRESS_AWARE и включив переключатель / 3GB в файл boot.ini.
В 64-разрядной версии Microsoft Windows в процессе, выполняющем исполняемый файл, который был связан с / LARGEADDRESSAWARE: NO, операционная система искусственно ограничивает часть виртуального адресного пространства процесса в пользовательском режиме до 2 ГиБ. Это касается как 32-, так и 64-битных исполняемых файлов. Процессы, выполняющие исполняемые файлы, которые были связаны с параметром / LARGEADDRESSAWARE: YES, который используется по умолчанию для 64-разрядных Visual Studio 2010 и более поздних версий, имеют доступ к более чем 2 ГиБ виртуального адресного пространства: до 4 ГиБ для 32-разрядных исполняемых файлов, до 8 ТиБ для 64-битных исполняемых файлов в Windows через Windows 8 и до 128 ТиБ для 64-битных исполняемых файлов в Windows 8.1 и более поздних версиях.
Распределение памяти с помощью C 's malloc устанавливает файл подкачки в качестве резервного хранилища для любого нового виртуального адресного пространства. Однако процесс также может явно отображать байты файла.
Для процессоров x86, Linux 32-бит позволяет разделить диапазоны адресов пользователя и ядра по-разному: 3G / 1G user / ядро (по умолчанию), пользователь / ядро 1G / 3G или пользователь / ядро 2G / 2G.