Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекцій із Системного програмування та...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
786.31 Кб
Скачать

1. Адресний простір процесу

В Win32® API використається пласка ' 32-розрядна модель пам'яті. Кожному процесу виділяється «особисте» (private) ізольований адресний простір, розмір якого становить 4Gb. Цей простір розбивається на регіони, небагато відмінні для Windows'95 й Windows NT. У загальному для тієї й іншої системи можна сказати, що нижні 2Gb ці простори відведені процесу для вільного використання, а верхні 2Gb зарезервовані для використання операційною системою.

Програма, лістинг якої наведений нижче, намагається обнулити сторінку за сторінкою в системній області (старший гігабайт адресного простору). Операція може завершитися невдачею по двох причинах. По-перше, реальної сторінки по зазначеній адресі може не бути1, а, по-друге, якщо сторінка існує, то може бути заборонений у неї доступ. Програма намагається обнулити сторінку (try) і, якщо одержує відмову (catch), те друкує про це повідомлення й переходить до наступної сторінки.

#include <windows.h> #include <iostream h>

void main()

{ II Системна область. Старший Gb адресного простору DWORD System Area Address = OxCOOOOOOO ;

while(1){

try {II Спроба запису

ZeroMemory( (LPVOID) System Area Address, 0x1000 );

}

catch(...) {II помилка запису

cout« "Exception: " « hex « SystemAreaAddress « endl;

}

SystemAreaAddress += 0x1000 ; II Перехід до наступної сторінки (4ДО)

}

Оскільки в Windows'95 відсутня захист сторінок системної області, то програма знищує цю область, що приводить до краху системи. Windows NT захищає системну область й, тому, «витримує натиск» програми.

2. Керування віртуальною пам'яттю. Vmm

VMM(Virtual Memory Manager) - частина операційної системи, що займається керуванням віртуальною пам'яттю. В Win32 використається сторінкова організація пам'яті. Розмір сторінок для платформ Intel й MIPS становить 4ДО. Розмір сторінок для DEC Alpha становить 8ДО.

Схема сторінкового перетворення в процесорах Intel докладно вивчалася в курсі «Програмування мовою асемблера. Частина 3». Win32 використає двоступінчасту схему сторінкового перетворення, підтримувану процесорами 386,486, Pentium. Додаткові схеми, які підтримує процесор Pentium Pro, не використаються.

Рис 10.1 - Керування віртуальною пам'яттю. VMM.

Кожному процесу призначається свій каталог сторінок. Саме тому адресний простір кожного процесу ізольовано.

Організацією свопинга займається VMM. При генерації системи на диску утвориться спеціальний файл свопинга, куди записуються ті сторінки, яким не перебуває місця у фізичній пам'яті. Процеси можуть захоплювати пам'ять у своєму 32-бітному адресному просторі й, потім, використати неї. При обігу потоку до комірки пам'яті можуть виникнути три різні ситуації:

Сторінка існує й перебуває в пам'яті

Сторінка існує й вивантажена на диск

Сторінка не існує

3. Файли даних, що проектуються на згадку

Проектування файлу даних в адресний простір процесу надає потужний механізм роботи з файлами. Зпроектувати файл на адресний простір процесу, програма одержує можливість працювати їм, як з масивом. Проектування файлу на згадку виконується в три етапи

Створюється об'єкт ядра «файл». У колишній термінології це операція відкриття файлу. Для створення об'єкта «файл» використається функція CreateFile, аналогічна функції ореп() з CRT-бібліотеки.

За допомогою функції CreateFileMapping створюється об'єкт ядра «проецируемый файл». При цьому використається описатель файлу (handle), повернутий функцією CreateFile. Тепер файл готовий до проектування.

Виробляється відображення об'єкта «проецируемый файл» або його частини на адресний простір процесу. Для цього застосовується функція MapViewOfFile.

Для відкріплення файлу від адресного простору процесу використається функція UnmapViewOfFile, а для знищення об'єктів «файл» й «проецируемый файл» - функція CloseHandle.

Загальна схема роботи із проецированными файлами така:

HANDLE hFile, hFileMapping; PVOID pMassive;

hFile = CreateFHe( «File Name»,...); hFileMapping = CreateFileMapping( hFile,...); CloseHandlef hFile); pMassive = MapViewOfFile( hFileMapping,...);

t* Робота з масивом pMassive */

UnmapViewOfFile( pMassive);