Оперативная память в 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 дескрипторы