Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Экзамен ОС 2018

.pdf
Скачиваний:
117
Добавлен:
29.01.2018
Размер:
4.67 Mб
Скачать

Оглавление

Структура работы программы :

Функции WinAPI

Для начала рассмотрим сам алгоритм использования механизма

Проецирование файла данных в файл:

1) Создается объект типа файл - CreateFile()

Оглавление

Оглавление

2)Создается объект типа проецируемый файл CreateFileMapping(). При этом используется дескриптор файла, возвращенный на п.1

3)Производится отображение объекта “проецируемый файл” или его части на ВАП процесса - функция MapViewOfFile()

Завершение проецирования файла данных :

1)Выполняется открепление файла от адрессного пространства - UnmapViewOfFile()

2)Выполняется закрытие дескрипторов - CloseHandle()

Создание объекта MMP (Memory - mapped file)

HANDLE CreateFileMapping (

HANDLE hFile, // дескриптор проецируемого файла

LPSECURITY_ATTRIBUTES lpAttributes, // атрибуты защиты объекта

DWORD flProtect, // флаги защиты страниц

DWORD dwMaximumSizeHigh, // старшее слово макс. Размера DWORD dwMaximumSizeLow, // младшее слово макс. Размера LPCTSTR lpName // имя объекта

);

Параметр flProtect :

PAGE_READONLY

SEC_COMMIT – по умолчанию

PAGE_READWRITE

SEC – проецирование исполняемого файла

PAGE_WRITECOPY

PAGE_EXECUTE_READ

SEC_NOCACHE – все страницы раздела определяются как некэшируемые

SEC_RESERVE – резервирует все страницы раздела, не выделяя физическую память

Функция OpenFileMapping - открытие проекции другим процессом

HANDLE OpenFileMapping (

DWORD dwDesiredAccess, // режим доступа

BOOL bInheritHandle,

//флажок наследования

LPCTSTR lpName

//имя объекта

);

Функция проецирования области

Оглавление

Оглавление

LPVOID MapViewOfFile (

HANDLE hFileMappingObject, // дескриптор проецируемого файла

DWORD dwDesiredAccess, // режим доступа

DWORD dwFileOffsetHigh, // старшее DWORD смещения DWORD dwFileOffsetLow, // младшее DWORD смещения SIZE_T dwNumberOfBytesToMap // количество байт отображения

//, 0 – отображать файл целиком

);

Параметр dwDesiredAccess

FILE_MAP_WRITE – доступ к операциям чтения-записи, проецируемый файл должен быть создан с защитой PAGE_READWRITE.

FILE_MAP_READ – доступ только для чтения, проецируемый файл должен быть создан с защитой PAGE_READWRITE или PAGE_READONLY.

FILE_MAP_ALL_ACCESS – то же самое, что FILE_MAP_WRITE.

FILE_MAP_COPY – копирование при доступе для записи,

проецируемый файл должен создаваться с флажком защиты PAGE_WRITECOPY. ● FILE_MAP_EXECUTE – доступ к исполнению кода из отображаемой

памяти, проецируемый файл должен быть создан с доступом

PAGE_EXECUTE_READWRITE или PAGE_EXECUTE_READ.

Функция проецирования области по определенному адресу

LPVOID MapViewOfFileEx (

HANDLE hFileMappingObject, // дескриптор отображаемого объекта

DWORD dwDesiredAccess, // режим доступа

DWORD dwFileOffsetHigh, // старшее DWORD смещения DWORD dwFileOffsetLow, // младшее DWORD смещения SIZE_T dwNumberOfBytesToMap, // число отображаемых байтов LPVOID lpBaseAddress // начальный адрес

);

Функция отмены проецирования области

BOOL UnmapViewOfFile (

LPCVOID lpBaseAddress // начальный адрес

);

Механизм совместного использования проецируемого файла

Один процесс создает объект «проецируемый файл» с помощью функции CreateFileMapping (), передавая в параметре lpName имя объекта.

Оглавление

Оглавление

Другой процесс открывает уже созданный объект «проецируемыйфайл» по имени.

Теперь два процесса могут совместно использовать объект «проецируемый файл». При этом, при помощи функции MapViewOfFile () каждый процесс проецирует этот объект на свое ВАП и используют эту часть адресного пространства как разделяемую область данных.

Взаимодействие процессов через общую область данных

Если один процесс меняет разделяемую область данных, то она меняется и для другого процесса.

Операционная система обеспечивает когерентность разделяемой области данных для всех процессов.

14. Архитектура памяти в MS Windows 2000+. Адресация расширенного адресного пространства. 64-разрядные операционные системы MS Windows.

Адресация расширенного адресного пространства

Address Windowing Extensions

Address Windowing Extensions (AWE) – программный интерфейс в ОС семейства Microsoft Windows, позволяющий 32-битному приложению получить доступ к оперативной памяти, размер которой превышает размеры доступного приложению виртуального адресного пространства (2-3 Гб).

Процесс отображения дополнительной памяти в адресное пространство приложения при помощи AWE называется «windowing» (оконный доступ) и сходен с концепцией «overlay» используемой, например, в DOS.

AWE не зависит от расширения Physical Address Extension и не препятствует его использованию.

В статье 2004 года, опубликованной в Dr. Dobb's Journal, отмечалось, что память, выделенная при помощи AWE не подлежит сохранению в swap-файле, и было высказано предположение, что в регионы AWE памяти удобно использовать для защиты данных, например, ключей шифрования.

Функции AWE API

VirtualAlloc () – резервирует диапазон виртуального адресного пространства для использования под AWE (атрибут MEM_PHYSICAL).

AllocateUserPhysicalPages () – выделяет физическую память для использования с AWE.

MapUserPhysicalPages () – проецирует (или отключает) виртуальное пространство AWE на произвольный набор физических страниц, полученных при помощи вызова AllocateUserPhysicalPages ().

Оглавление

Оглавление

MapUserPhysicalPagesScatter () – выполняет групповое проецирование (или отключение) виртуального пространства AWE на несколько блоков физических страниц.

FreeUserPhysicalPages () – освобождает физическую память, которая была выделена под AWE.

Пример использования AWE

ВAWE-окно в виртуальном адресном пространстве приложения проецируется блок физической памяти, предварительно выделенный с помощью функции

AllocateUserPhysicalPages ().

Функция AllocateUserPhysicalPages

BOOL AllocateUserPhysicalPages(

HANDLE hProcess, // дескриптор процесса

PULONG_PTR NumberOfPages,

//на входе: количество страниц на выделение,

//на выходе: количество выделенных страниц RAM PULONG_PTR UserPfnArray // массив номеров фреймов,

//идентифицирующий выделенные окну страницы

);

Функция MapUserPhysicalPages

BOOL MapUserPhysicalPages(

Оглавление

Оглавление

PVOID lpAddress, // адрес адресного окна

ULONG_PTR NumberOfPages, // число элементов в массиве PULONG_PTR UserPfnArray // массив фреймов страниц

);

Функция отключает текущий блок оперативной памяти от адресного окна, если вместо параметра UserPfnArray передается NULL.

Функция FreeUserPhysicalPages

BOOL FreeUserPhysicalPages(

HANDLE hProcess, // дескриптор процесса

PULONG_PTR NumberOfPages,

//на входе: количество страниц на освобождение,

//на выходе: количество освобожденных страниц RAM PULONG_PTR UserPfnArray // массив номеров фреймов,

//идентифицирующий освобождаемые страницы RAM

);

Ограничения AWE

Страницы такой памяти нельзя разделять между процессами.

Одну и ту же физическую страницу нельзя проецировать по более чем одному виртуальному адресу в рамках одного процесса.

B старых версиях Windows страницы такой памяти могут иметь единственный атрибут защиты – «для чтения и записи». B Windows Server 2003 Service Pack 1

и выше также поддерживаются атрибуты «нет доступа» и «только для чтения».

AWE и архитектура x64

64-разрядная Windows полностью поддерживает AWE, так что перенос 32-битных приложений, использующих этот механизм, не вызывает никаких проблем.

Однако AWE не столь полезен для 64-битных приложений, поскольку размеры их адресных пространств намного больше.

Однако AWE дает возможность приложению выделять физическую память, которая никогда не сбрасывается на диск.

64-разрядные операционные системы MS Windows

Архитектура AMD64

40-разрядные физические адреса, 48-разрядные виртуальные адреса;

шестнадцать 64-разрядных целочисленных регистров;

шестнадцать 128-разрядных регистров SSE/SSE2/SSE3 (+ 16 256-разрядных регистров AVX/AVX2)

Оглавление

Оглавление

Адресное пространство Windows для архитектуры x64

Теоретически 64-разрядные процессы используют 64-битные указатели, так что их максимальное ВАП равно 264 = 16 экзабайтам.

Однако в текущих реализациях архитектуры x64 размер виртуальных адресов ограничен 48 битами.

Windows не делит ВАП равномерно между активными процессами и системой, а вместо этого определяет область в адресном пространстве для процессов и других системных ресурсов памяти, таких как системные записи таблицы страниц (PTE), файловые кэши, резидентный и нерезидентный (paged и non-paged) пулы.

Достоинства и недостатки 64-разрядных приложений

Главное достоинство 64-разрядной архитектуры является предоставление процессу возможности адресации до 8 Тб ВАП.

Приложение может воспользоваться новыми регистрами процессора.

Работа с 64-разрядными числами напрямую и поддержка обработки 128-разрядных чисел по частям.

Главным недостатком 64-разрядной архитектуры является то, что одни и те же данные (и код) будут занимать больше места в памяти и на диске (из-за увеличения размера указателей, других аналогичных типов и выравнивания).

Это увеличивает размер необходимой процессу памяти, снижая эффективность кэш-памяти.

Поддержка 32-разрядных приложений в 64-разрядной среде Windows

WoW64 (Windows-on-Windows 64-bit) – подсистема операционной системы Windows, позволяющая запускать 32-разрядные приложения на всех 64-разрядных версиях Windows.

Из-за наличия прослойки WoW64 32-разрядные программы работают менее эффективно в 64-разрядной среде, чем в 32-разрядной .

Однако 32-разрядные приложения могут получить одно преимущество от их запуска в 64-разрядной среде. 32-разрядная программа, запущенная на 64-разрядной системе, может адресовать почти 4 GB памяти (на практике около

3.5 GB).

WoW64 не поддерживает работу 16-разрядных приложений в 64-разрядных версиях Windows.

Необходимость написания 64-разрядных приложений

Очень большие объемы обрабатываемых данных.

Необходимость поддержки совместимости (64-разрядные приложения работают только с 64-разрядными DLL и наоборот).

Оглавление

Оглавление

Повышение производительности приложения.

Повышение производительности 64-разрядного приложения

Перекомпиляция программы для 64-разрядной системы позволит ей использовать огромные объемы оперативной памяти, а также повысит скорость ее работы на 5-15%.

Повышение скорости работы на 5-10% произойдет за счет использования архитектурных возможностей 64-разрядного процессора, например большего количества регистров.

Еще 1-5% прироста скорости обуславливается отсутствием прослойки WoW64, которая транслирует вызовы API между 32-разрядным приложениями и 64-разрядной операционной системой.

Например, компания Adobe заявляет, что 64-разрядный Photoshop CS4 на 12% быстрее его 32-разрядной версии.

Виртуальный адрес на платформе x64

64-разрядная Windows на платформе x64 в общем случае применяет 4-х уровневую схему таблиц страниц.

У каждого процесса имеется расширенный каталог страниц верхнего уровня (называемый картой страниц уровня 4), содержащий 512 указателей на структуру третьего уровня – родительский каталог страниц.

Каждый родительский каталог страниц хранит 512 указателей на каталоги страниц второго уровня, а те содержат по 512 указателей на индивидуальные таблицы страниц.

Таблицы страниц (в каждой из которых 512 PTE) указывают на 4-х Кбайтовые страницы в памяти.

Оглавление

Оглавление

Трансляция виртуальных адресов в x64-системах

Адресация «больших» страниц на платформе x64

Если используются «большие» 2 Мегабайтовые страницы, то в виртуальном адресе структура первого уровня не используется, а смещение внутри страницы занимает разряды с 0 по 20.

Кроме того, архитектура x64 позволяет использовать «сверхбольшие» страницы размером 1 Гбайт (Windows пока не поддерживает), в этом случае в виртуальном адресе структуры первого и второго уровня не используются, а смещение внутри страницы занимает разряды с 0 по 29.

Оглавление

Оглавление

15. Архитектура памяти в MS Windows 2000+.

Использование локальной памяти потока. Функции

Win32 API.

Использование локальной памяти потока

Локальная память потока (TLS)

Для решения ситуаций, когда есть данные, которые должны быть связаны индивидуально с каждым потоком, необходимо использовать механизм локальной памяти потока TLS (Thread Local Storage).

Поток имеет доступ лишь к своим TLS-переменным, и не может обратиться к TLS-переменным любого другого потока.

Назначение TLS

Например, пусть процесс обрабатывает некоторый массив данных.

Каждый отдельных элемент массива должен быть поставлен в соответствие на обработку отдельному потоку.

Встает задача передачи каждому потоку индекса обрабатываемого элемента массива:

Для этого можно использовать передачу параметров через стек функции потока ThreadProc (). Тогда индекс будет храниться в локальной переменной функции ThreadProc ().

Но представьте, что ThreadProc () вызывает другую функцию потом еще одну, и так поток может вызывать сотни функций с разными уровнями вложенности. Куда денется индекс элемента массива, который должен обработать поток? Да, можно передавать индекс каждой вложенной функции через стек, но это очевидно будет сказываться на эффективности программы.

Решением подобной задачи является использование каждого потока своей локальной памяти – TLS.

Виды TLS

динамическая TLS:

размер ячейки локальных данных – 4 байт

количество локальных данных – ограничено

требует использования функций API

статическая TLS:

размер ячейки локальных данных – не ограничен

количество локальных данных – не ограничено

не требует использования функций API

Динамическая TLS

Каждому потоку выделяется определенное количество ячеек размером 4 байта.

Количество ячеек зависит от версии Windows, самое маленькое – это 64 ячейки на процесс, в ОС Windows 2000 и старше – 1088 ячеек на процесс. Количество ячеек можно определить с помощью константы TLS_MINIMUM_AVAILABLE​.

Оглавление