Виртуальная память – это совокупность программно-аппаратных средств, позволяющая пользователю составлять программы, размер которых превосходит имеющийся размер ОЗУ.
Для этого виртуальная память решает следующие задачи:
q Размещает данные в запоминающих устройствах разного типа, например, часть в ОЗУ, часть на жестком диске.
q Перемещает по мере необходимости данные между устройствами разного типа. Например, подгружает нужную часть программы с диска в ОЗУ.
q Преобразует виртуальный (линейный) адрес в физический.
Все эти действия используются без участия программиста.
ОЗУ
В Windows NT, 95 каждому процессу предоставляется адресное пространство 4 Гб. Адресное пространство каждого процесса скрыто от других процессов. Каждый процесс получает доступ только к той памяти, которая принадлежит ему. Память других процессов скрыта.
1234567816 – А
1234567816 – В
И А, и В обращаются к ячейкам, которые находятся по различным физическим адресам. С помощью страничной организации одинаковые линейные адреса преобразуются в различные физические. Это достигается за счёт того, что у них разная таблица страниц и отображение страниц.
ОЗУ в виртуальном адресном пространстве выделяется разделами. Выделения разделов различны для различных разделов. Например, в Windows из 4 Гб: 2 Гб программе, а 2 Гб ОС. В Windows 2000 advanced server теоретически можно выделить до 3 Гб. С чем связано такое расположение? Это связано с тем, что Windows NT создавалась под различные платформы, например, в MIPS 4000 так надо. Для работы с ОЗУ.
kernel32.dll
Win32API
пользовательский
ядра
В кольце 0. ntoskrnl.exe - Win NT
vmm.vxd - Win 95, 98
Документированные функции в kernel32.dll. Разбиение адресного пространства на разделы в Windows 95, 98.
FFFF:FFFF
С000:0000
5 Драйверы виртуальных устройств
BFFF:FFFF
8000:0000
4 Win32 модули системные DLL
7FFF:FFFF
0040:0000
3 Win32 процессы
003F:FFFF
0000:1000
2 MS-DOS и 16-битная Windows
0000:0FFF
0000:0000
1 MS-DOS и 16-битная Windows
Разделы 1 и 2 предназначены для совместимости с MS-DOS и 16-битной Windows. Разница в том, что 1 не доступен. При попытке доступа возникает нарушение доступа. Раздел 2 доступен по чтению/записи. Раздел 3 имеет размер 2 Гб - 4 Мб. В нем находится личное адресное пространство процесса. В Win32 никакой другой процесс не имеет доступа к этому разделу. Основной объем данных принадлежащий процессу хранится именно в этом разделе, то есть, если посмотреть заголовок, то адрес любого exe файла для Win 95, 98 будет 0040:0000. В разделе 4 размером 1 Гб Windows 95, 98 хранит данные, доступные всем Win32 процессам. Сюда загружаются kernel32.dll, gdi32.dll, user32.dll. Линейные адреса этого раздела отображаются на одни и те же страницы физической памяти, если сюда записать что-нибудь, то Windows зависнет. В разделе 5, размер которого 1 Гб, находится код ОС, то есть тот код, который находится в кольце 0. Это виртуальные драйверы, низкоуровневые процедуры управления файлами. Этот раздел также доступен всем процессам. Искажение информации в этом разделе грозит краху ОС.
Деление на разделы в Windows NT, 2000.
0000:FFFF
0000:0000
7FFF:FFFF
7FFF:0000
FFFF:FFFF
8000:0000
7FFE:FFFF
0001:0000
4 ОС
3 Для выявления указателей с неправильным значением
2 Адресное пространство процесса
1 Для выявления указателей с неправильным значением
Разделы 1 и 3 предназначены для выявления указателей с неправильным значением. При выявлении неправильного значения ОС генерирует нарушение доступа. Эти разделы "охраняют" разделы 2 и 4.
Раздел 2 - это область размером 2 Гб-128 Кб. Это личное адресное пространство конкретного процесса, причем эта область доступна данному процессу. В этой же области находятся все системные библиотеки пользовательского режима kernel32.dll и user32.dll. Если какой-либо процесс искажает системную dll, то эта ошибка скажется только на этом процессе. Если посмотреть любое exe приложение под Windows NT, Windows 2000, то начальный адрес будет 0001:0000.
Раздел 4. В него загружаются ядро Windows NT и драйверы устройств. Этот раздел полностью защищен и по чтению, и по записи.