
- •"Програмне забезпечення автоматизованих систем"
- •1. Оперативна пам'ять
- •2. Регістри
- •3. Прапори
- •1. Переходи
- •2. Безумовні переходи
- •3. Умовні переходи
- •4. Команди керування циклом
- •1. Подання даних арифметичні операції
- •2. Цілі числа без знака
- •3. Цілі числа зі знаком
- •4. Особливості виконання арифметичних операцій
- •5. Подання символів і рядків
- •6. Подання адрес
- •7. Директиви визначення даних
- •1. Структура команд. Виконавчі адреси
- •2. Формати команд
- •3. Запис команд в masm
- •1. Сегменти пам’яті, сегментні регістри
- •2. Сегментні регістри по домовленості
- •3. Сегментування, базування й індексування адрес
- •4. Програмні сегменти. Директива assume
- •5. Початкове завантаження сегментних регістрів
- •6. Посилання вперед
- •1. Строкові операції
- •1. Стек
- •2. Основні стекові команди
- •1. Організація процедур та переривань
- •2. Передача параметрів процедурам через регістри, через стек, через таблиці, через глобальні області
- •3. Передача параметрів по ссылке
- •4. Передача параметрів по повернутому значенню
- •5. Передача параметрів в стеку
- •6. Локальні змінні
- •1. Процеси і потоки
- •1.1 Розподіл часу між потоками
- •1.2 Динамічна зміна рівня пріоритету потоку
- •2. Робота із процесами й потоками в Win32 api
- •1. Адресний простір процесу
- •2. Керування віртуальною пам'яттю. Vmm
- •3. Файли даних, що проектуються на згадку
- •4. Взаємодія процесів через загальну область даних. Когерентність
- •5. Купи
- •1. Визначення вікна. Компоненти й параметри вікон
- •2. Клас вікна
- •3. Ієрархія вікон
- •1. Обмін даними між процесами
- •2. Вилучений виклик процедур (rpc - Remote Procedure Call)
- •3. Синхронізація потоків
- •1. Загальний порядок обробки виключень
- •2. Фільтри й оброблювачі виключень
- •1. Загальна структура системного реєстру
- •2. Робота додатків із системним реєстром
- •1. Файлові структури
- •2. Робота з томами й каталогами
- •3. Синхронна робота з файлами
- •4. Асинхронна робота з файлами
- •1. Системні файли ntfs
- •2. Master File Table (mft)
- •3. Цілісність даних і здатність до самовідновлення.
- •4. Організація й керування дисками
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);