Оперативная память в Windows

advertisement
Оперативная память в Windows
Защита памяти в Windows




Доступ к общесистемным структурам данных и
пулам памяти, используемым системными
компонентами режима ядра, возможен лишь
из режима ядра — у потоков
пользовательского режима нет доступа к
соответствующим страницам.
У каждого процесса имеется индивидуальное
закрытое адресное пространство, защищенное
от доступа потоков других процессов.
Все процессоры, поддерживаемые Windows,
предоставляют ту или иную форму аппаратной
защиты памяти.
Совместно используемые объекты имеют
стандартные для Windows списки контроля
доступа, проверяемые при попытках
процессов открыть эти объекты.
Распределение памяти Windows
Закрытый, 64 Кб
0х7FFF0000
0х80000000
Закрытый, 64 Кб
0хС0000000
0хС0800000
0хFFFFFFFF
Код приложений и dll,
стеки потоков,
Глобальные переменные
Ядро, исполнительная
система, HAL, драйвера,
стеки ядра
Таблицы страниц
Системный кэш,
подкачиваемый и
неподкачиваемый пул
Память процесса
пользователя Память ядра
2 Гб-128Кб
2 Гб
0х00000000
0х00010000
/3GB
0х00000000
Код ядра, драйвера …
0хFFFFFFFF
Память ядра
1 Гб
0хС0000000
Память процесса
пользователя
3 Гб
Код приложений и dll,
стеки потоков,
Глобальные переменные
Выделение памяти процессу

Гранулярность выделения: 64 Кб

Двухступенчатая схема
выделения:
Резервирование / Reserving
 Выделение / Commiting


Освобождение памяти:
Возврат / Decommiting
 Освобождение / Releasing

Атрибуты защиты страниц

PAGE_NOACCESS
Доступ полностью запрещён

PAGE_READONLY
Только чтение

PAGE_READWRITE
Чтение и запись

PAGE_EXECUTE
Только выполнение кода

PAGE_EXECUTE_READ
Выполнение кода и чтение

PAGE_EXECUTE_READWRITE
Выполнение кода, чтение, запись

PAGE_WRITECOPY
Чтение, при записи предоставляется копия

PAGE_EXECUTE_WRITECOPY
Любые операции, при записи создаётся копия
Дополнительные флаги



PAGE_NOCACHE
PAGE_WRITECOMBINE
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
1.
2.
3.
Резервируется регион
максимального размера
Выделяются две страницы, на
второй устанавливается флаг
PAGE_GUARD
При обращении к странице с
флагом PAGE_GUARD
1.
2.
3.
Происходит исключение
Выделяется следующая страница
Флаг PAGE_GUARD переставляется
на последнюю выделенную
страницу
Стек процесса и флаг PAGE_GUARD
Зарезервировано
SP
Выделено
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
Использовано
Зарезервировано
SP
Выделено
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
Использовано
Зарезервировано
SP
Выделено
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
Использовано
Выделено
SP
Зарезервировано
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
Использовано
Выделено
SP
Зарезервировано
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
Использовано
Выделено
SP
Зарезервировано
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
Использовано
Выделено
SP
Зарезервировано
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
SP
Выделено
Использовано
Зарезервировано
PAGE_GUARD
Стек процесса и флаг PAGE_GUARD
Выделено
Использовано
Зарезервировано
SP
Стек процесса и флаг PAGE_GUARD
Выделено
Использовано
Зарезервировано
SP
Стек процесса и флаг PAGE_GUARD
SP
Зарезервировано
Выделено
Использовано
Стек процесса и флаг PAGE_GUARD
SP
Зарезервировано
Выделено
Использовано
Address Windowing Extensions / AWE



Выделение
Виртуальная Физическая
физической
память 2Гб
память 128Гб
памяти
Создание
региона
виртуальной
памяти – окна
Проецирование
на окно
физической
памяти
Address Windowing Extensions / AWE



Выделение
Виртуальная Физическая
физической
память 2Гб
память 128Гб
памяти
Создание
региона
виртуальной
памяти – окна
Проецирование
на окно
физической
памяти
Address Windowing Extensions / AWE



Выделение
Виртуальная Физическая
физической
память 2Гб
память 128Гб
памяти
Создание
региона
виртуальной
памяти – окна
Проецирование
на окно
физической
памяти
Address Windowing Extensions / AWE



Выделение
Виртуальная Физическая
физической
память 2Гб
память 128Гб
памяти
Создание
региона
виртуальной
памяти – окна
Проецирование
на окно
физической
памяти
Address Windowing Extensions / AWE



Выделение
Виртуальная Физическая
физической
память 2Гб
память 128Гб
памяти
Создание
региона
виртуальной
памяти – окна
Проецирование
на окно
физической
памяти
Ограничения AWE

Необходима привилегия Lock Pages in Memory

Нельзя выполнять код

Страницы нельзя разделять между процессами

Страницы не выгружаются из памяти

Одну и ту же физическую страницу нельзя
спроецировать более чем на одну
виртуальную

Первоначально был доступен только режим
доступа PAGE_READWRITE, начиная с Windows
Server 2003 SP1 – также PAGE_NOACCESS и
PAGE_READONLY
Выделение памяти
LPVOID VirtualAlloc(
LPVOID lpAddress, // region to reserve or commit
SIZE_T dwSize,
// size of region
DWORD flAllocationType, // type of allocation
DWORD flProtect
// type of access protection
);
flAllocationType:


MEM_RESERVE
MEM_COMMIT
flProtect:
 PAGE_READONLY
 PAGE_READWRITE
 …
Освобождение памяти
LPVOID VirtualFree(
LPVOID lpAddress, // address of region
SIZE_T dwSize,
// size of region
DWORD dwFreeType, // operation type
);
dwFreeType:


MEM_RELEASE
MEM_DECOMMIT
Проецируемые в память файлы

Создать объект ядра
файл

Создать объект ядра
проекция файла

Виртуальная память
Диск
Проецирование части
файла в адресное
пространство
Объекты ядра
Проецируемые в память файлы

Создать объект
ядра файл

Создать объект ядра
проекция файла

Виртуальная память
Диск
Проецирование части
файла в адресное
пространство
Объекты ядра
Файл
Проецируемые в память файлы

Создать объект
ядра файл
Виртуальная память

Создать объект
ядра проекция
файла
Диск

Проецирование части
файла в адресное
пространство
Объекты ядра
Файл
Проекция
файла
Проецируемые в память файлы

Создать объект
ядра файл
Виртуальная память

Создать объект
ядра проекция
файла
Диск

Проецирование
части файла в
адресное
пространство
Объекты ядра
Файл
Проекция
файла
Проецируемые в память файлы

Создать объект
ядра файл
Виртуальная память

Создать объект
ядра проекция
файла
Диск


Проецирование
части файла в
адресное
пространство
Изменение места
проекции
Объекты ядра
Файл
Проекция
файла
Проецируемые в память файлы

Создать объект
ядра файл
Виртуальная память

Создать объект
ядра проекция
файла
Диск


Проецирование
части файла в
адресное
пространство
Изменение места
проекции
Объекты ядра
Файл
Проекция
файла
Создание объекта файл
HANDLE CreateFile(
LPCTSTR lpFileName,
// file name
DWORD dwDesiredAccess,
// access mode
DWORD dwShareMode,
// share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to template file
);
Создание проекции файла
HANDLE CreateFileMapping(
HANDLE hFile,
// handle to file
LPSECURITY_ATTRIBUTES lpAttributes, // security
DWORD flProtect,
// protection
DWORD dwMaximumSizeHigh,//high-order DWORD of size
DWORD dwMaximumSizeLow, // low-order DWORD of size
LPCTSTR lpName
// object name
);
flProtect:

PAGE_READONLY

PAGE_READWRITE

PAGE_WRITECOPY
Проецирование памяти
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
// handle to file-mapping object
DWORD dwDesiredAccess,
// access mode
DWORD dwFileOffsetHigh,
// high-order DWORD of offset
DWORD dwFileOffsetLow,
// low-order DWORD of offset
SIZE_T dwNumberOfBytesToMap
// number of bytes to map
);
dwDesiredAccess:

FILE_MAP_READ

FILE_MAP_WRITE

FILE_MAP_ALL_ACCESS

FILE_MAP_COPY
Другие функции
HANDLE OpenFileMapping(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
);
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress
);
// access mode
// inherit flag
// object name
// starting address
BOOL FlushViewOfFile(
LPCVOID lpBaseAddress, // starting address
SIZE_T dwNumberOfBytesToFlush
// number of bytes in range
);
Разделяемая память и проецируемые
файлы
Виртуальная
память процесса 2
Виртуальная
память процесса 1
Физическая
память
Код DLL
Диск
Создание разделяемой памяти
память
процесс 1
дескрипторы
физическая
память
Процесс 1
 Создать объект
проекция файла
(hFile=NULL, задать
размер и имя)
 Спроецировать память
Процесс 2
 Открыть объект
проекция файла
 Спроецировать память
swap
память
процесс 2
Объекты
ядра
дескрипторы
Создание разделяемой памяти
память
процесс 1
дескрипторы
физическая
память
Процесс 1
 Создать объект
проекция файла
(hFile=NULL, задать
размер и имя)
 Спроецировать память
Процесс 2
 Открыть объект
проекция файла
 Спроецировать память
swap
Объекты
ядра
FM
память
процесс 2
дескрипторы
Создание разделяемой памяти
память
процесс 1
дескрипторы
физическая
память
Процесс 1
 Создать объект
проекция файла
(hFile=NULL, задать
размер и имя)
 Спроецировать
память
Процесс 2
 Открыть объект
проекция файла
 Спроецировать память
swap
Объекты
ядра
FM
память
процесс 2
дескрипторы
Создание разделяемой памяти
память
процесс 1
дескрипторы
физическая
память
Процесс 1
 Создать объект
проекция файла
(hFile=NULL, задать
размер и имя)
 Спроецировать
память
Процесс 2
 Открыть объект
проекция файла
 Спроецировать память
swap
Объекты
ядра
FM
память
процесс 2
дескрипторы
Создание разделяемой памяти
память
процесс 1
дескрипторы
физическая
память
Процесс 1
 Создать объект
проекция файла
(hFile=NULL, задать
размер и имя)
 Спроецировать
память
Процесс 2
 Открыть объект
проекция файла
 Спроецировать
память
swap
Объекты
ядра
FM
память
процесс 2
дескрипторы
Download