Операц_йн_ системи 4.ppt
- Количество слайдов: 33
Змістовний модуль: ІСТОРІЯ РОЗВИТКУ, ФУНКЦІЇ, АРХІТЕКТУРА ТА ПРИНЦИПИ РОЗРОБКИ СУЧАСНИХ ОС Розділ 2: ПОВТОРНЕ ВИКОРИТАННЯ КОДУ Лекція 4 Принципи створення та використання бібліотек. Динамічні бібліотеки. Частина 1 Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 1
ПИТАННЯ ДЛЯ ВИВЧЕННЯ 1. Створення динамічних бібліотек. 2. Використання динамічних бібліотек. Статичний режим 3. Використання динамічних бібліотек. Динамічний режим 4. Приклад створення та використання 5. Переваги та недоліки різних режимів використання Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 2
ВИЗНАЧЕННЯ ДИНАМІЧНОЇ БІБЛІОТЕКИ Динамічні бібліотеки (Dynamic Link Library - DLL). Завантажуються разом з програмою, або під час її виконання Функція, що експортується (зовнішня функція) – це функція, яка входить до складу DLL, і яку можуть використовувати зовнішні програми. В разі статичних бібліотек усі функції експортуються. Функція, що імпортується – це функція з DLL, яка використовується в іншій програмі. Тобто одна й та ж функція для DLL є функцією, що експортується, і для головної програми - функцією, що імпортується. Внутрішня функція може бути викликана тільки функціями бібліотеки Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 3
ПОЗНАЧЕННЯ ФУНКЦІЙ Для зовнішніх функцій – таблиця, куди їх адреси. Ця таблиця разом з ім'ям DLL – файл <Ім'я бібліотеки>. lib Для позначення використовується __declspec (dllexport). Функції, що імпортуються, позначаються: __declspec (dllimport). Таким чином, в файлі заголовків для DLL та головної програми – різне позначення функцій! Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 4
ФАЙЛИ ЗАГОЛОВКІВ ДЛЯ DLL ТА ГОЛОВНОЇ ПРОГРАМИ // DLL #pragma once __declspec (dllexport) // заголовок 1 функції __declspec (dllexport) // заголовок 2 функції … // Головна програма #pragma once __declspec (dllimport) // заголовок 1 функції __declspec (dllimport) // заголовок 2 функції … Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 5
УНІВЕРСАЛЬНИЙ ФАЙЛ ЗАГОЛОВКІВ #pragma once typedef unsigned __int 64 ulong 64; #ifdef _STATIC #define MATH 64_API #else #ifdef _USRDLL #define MATH 64_API __declspec (dllexport) #else #define MATH 64_API __declspec (dllimport) #endif #ifdef __cplus extern "C" { #endif MATH 64_API unsigned __stdcall add 64 (ulong 64 a, ulong 64 b, ulong 64 *c); MATH 64_API ulong 64 __stdcall mul 64 (ulong 64 a, ulong 64 b, ulong 64 *c); #ifdef __cplus } #endif Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 6
СТВОРЕННЯ ДИНАМІЧНОЇ БІБЛІОТЕКИ. КРОК 1 Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 7
СТВОРЕННЯ ДИНАМІЧНОЇ БІБЛІОТЕКИ. КРОК 2 Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 8
СТВОРЕННЯ ДИНАМІЧНОЇ БІБЛІОТЕКИ. КРОК 3 Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 9
СТВОРЕННЯ ДИНАМІЧНОЇ БІБЛІОТЕКИ. РЕЗУЛЬТАТ • Файл заголовків (math 64. h) • Динамічна бібліотека (math 64. dll) – формат співпадає з форматом exe файлів, тобто може використовуватись різними середовищами • Довідник функцій бібліотеки (math 64. lib) – формати відрізняються для різних середовищ. Програма implib. exe дозволяє перетворювати Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 10
СПОСОБИ ВИКОРИСТАННЯ ДИНАМІЧНИХ БІБЛІОТЕК 1 Статичне завантаження (завантаження під час завантаження додатка, який використовує DLL) – якщо немає потрібної DLL – додаток не почне виконуватись 2 Динамічне завантаження (завантаження та вивантаження по потребі під час виконання додатка, який використовує DLL) – завантажуються тільки ті DLL, з яких викликаються функції, після останнього використання можна вивантажити Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 11
АЛГОРИТМ ЗАВАНТАЖЕННЯ ТА ВИВАНТАЖЕННЯ DLL – об'єкт ядра, пам’ять виділяється в адресному просторі ядра, тому одна DLL доступна усім додаткам, які виконуються. Ім'ям об'єкту є повне ім'я файлу з іменем DLL, тобто одному і тому ж файлу, розташованому в різних місцях відповідають різні об'єкти!! Алгоритм завантаження. 1. Перевірка наявності бібліотеки в адресному просторі ядра, 2. Якщо є, то рахівних використання збільшується на 1, якщо немає – обєкт створюється (виділяється пам’ять для нього) та рахівник використання встановлюється в 1. Результат кроку – дескриптор ядра, або 0 в разі, якщо немає DLL або порушено формат файлу з DLL. Алгоритм вивантаження. 1. Якщо немає відповідного об'єкту ядра – помилка та вихід 2. Рахівник використання зменшується на 1 3. Якщо Рахівник використання дорівнює 0, то визволення пам'яті, зайнятої об'єктом Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 12
ВИКОРИСТАННЯ DLL. СТАТИЧНЕ ЗАВАНТАЖЕННЯ Для використання необхідно мати: • Файл заголовків; • DLL; • LIB файл потрібного формату. Головна програма – як для використання статичної бібліотеки Файл. lib додаємо як для статичної бібліотеки. Де розташувати файл з DLL? (розглянемо пізніше, зараз в папку з. exe файлом) Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 13
ВИКОРИСТАННЯ DLL. СТАТИЧНЕ ЗАВАНТАЖЕННЯ. ГОЛОВНА ПРОГРАМА #include "stdafx. h" #include "math 64. h" int _tmain(int argc, _TCHAR* argv[]) { ulong 64 a = 0 x. FFFFFFFFL, b = 0 x. FFFFFFFFL, c, d; unsigned carry = add 64 (a, b, &c); printf ("%I 64 x + %I 64 x = %x %I 64 xn", a, b, carry, c); d = mul 64 (a, b, &c); printf ("%I 64 x * %I 64 x = %I 64 x %16. 16 I 64 xn", a, b, d, c); return 0; } Порівняйте головну програму для використання статичної та динамічної бібліотек. Вони співпадають! Але для правильного використання файлу math 64. h для статичної бібліотеки треба задати макрос _STATIC. Для використання динамічної бібліотеки задавати нічого не потрібно! Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 14
ПРАВИЛА ВИКОРИСТАННЯ ФУНКЦІЙ WIN API 1. 2. 3. 4. 5. 6. Необхідно підключити файл заголовків Windows. h Усі функції мають узгодження по виклику __stdcall (WINAPI) Усі типи та константи Windows задаються великими літерами, наприклад, DWORD – unsigned, WORD – short, INVALID_HANDLE_VALUE. Кожне слово в імені функції починається з великої літери, наприклад, Load. Library. Якщо функція може завершитися успішно або помилково – вона повертає BOOL (0 – неправда, …). Якщо вона повертає дескриптор, то в разі помилки повертає 0 або INVALID_HANDLE_VALUE. При помилковому завершенні функції для визначення коду помилки використовується функція Get. Last. Error. По номеру помилки можна визначити код помилки в файлі заголовків Win. Error. h (Приклад, код 126 - ERROR_MOD_NOT_FOUND) Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 15
КОД ДЛЯ ВИВЕДЕННЯ ПОМИЛКИ ЗГІДНО ЇЇ КОДУ void Print. Error (DWORD dw. Code) { LPVOID lp. Msg. Buf; Format. Message( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, // Рядок для форматування dw. Code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lp. Msg. Buf, 0, // Розмір вихідного буферу NULL // va_list –змінний список параметрів, який приймає участь в //форматуванні ); Message. Box(NULL, (LPCTSTR)lp. Msg. Buf, _T("Error"), MB_OK); Local. Free(lp. Msg. Buf); } Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 16
ФУНКЦІЇ ДЛЯ РОБОТИ З DLL 1. HMODULE WINAPI Load. Library( __in LPCTSTR lp. File. Name ); 2. BOOL WINAPI Free. Library( __in HMODULE h. Module ); 3. DWORD WINAPI Get. Module. File. Name( __in HMODULE h. Module, __out LPTSTR lp. Filename, __in DWORD n. Size ); 4. FARPROC WINAPI Get. Proc. Address( __in HMODULE h. Module, __in LPCSTR lp. Proc. Name ); Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 17
АЛГОРИТМ ПОШУКУ DLL Каталог, з якого завантажено додаток (. exe). BOOL WINAPI Set. Dll. Directory( __in LPCTSTR lp. Path. Name ); Системний каталог. Для визначення використовувати функцію Get. System. Directory (System 32) Код для визначення імені: TCHAR System. Directory[MAX_PATH]; Get. System. Directory (System. Directory, MAX_PATH); _tprintf (_T("System. Directory: %sn"), System. Directory); } // С: windowssystem 32 16 бітний системний каталог (С: windowssystem) Windows каталог. Для визначення використовувати функцію Get. Windows. Directory : (UINT WINAPI Get. Windows. Directory( __out LPTSTR lp. Buffer, __in UINT u. Size ); ). (С: windows) Поточний каталог (Get. Current. Directory (DWORD WINAPI Get. Current. Directory( __in DWORD n. Buffer. Length, __out LPTSTR lp. Buffer ); )) – там, де файл vcproj для поточного проекту. Пошук виконується тільки в разі відсутності функції Set. Dll. Directory, або після її виклику з параметром NULL Каталоги, які задані в параметрі середовища PATH (Мой компьютер/Свойства/Дополнительно/Переменные среды/Path) Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 18
ГОЛОВНА ПРОГРАМА З ВИКОРИСТАННЯМ DLL. ДИНАМІЧНЕ ЗАВАНТАЖЕННЯ. СТВОРЕННЯ Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 19
ГОЛОВНА ПРОГРАМА З ВИКОРИСТАННЯМ DLL. ДИНАМІЧНЕ ЗАВАНТАЖЕННЯ. ТЕКСТ 1 // Заголовки для виведення помилок #include "My. Windows. h" // Заголовки для універсального кодування #include
ГОЛОВНА ПРОГРАМА З ВИКОРИСТАННЯМ DLL. ДИНАМІЧНЕ ЗАВАНТАЖЕННЯ. ТЕКСТ 2 int _tmain(int argc, _TCHAR* argv[]) { int i. Res = 1; // Код повернення програми // Визначення каталогу для DLL (для довідки) TCHAR Buffer [MAX_PATH]; Get. Dll. Directory( MAX_PATH, Buffer); _tprintf (_T("%sn"), Buffer); // Завантаження DLL. Перевірка наявності помилки HMODULE h = Load. Library( _T("math 64 DLL. dll") ); if (h == 0) { Print. Error(Get. Last. Error()); return i. Res; } Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 21
ГОЛОВНА ПРОГРАМА З ВИКОРИСТАННЯМ DLL. ДИНАМІЧНЕ ЗАВАНТАЖЕННЯ. ТЕКСТ 3 else{ // Визначення повного імені файлу // для довідки TCHAR lp. Filename [MAX_PATH]; DWORD dw. Size = Get. Module. File. Name( lp. Filename, sizeof (lp. Filename) ); Get. Module. File. Name( h, lp. Filename, 0 ); _tprintf (_T("%sn"), lp. Filename); } Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва h, 22
ГОЛОВНА ПРОГРАМА З ВИКОРИСТАННЯМ DLL. ДИНАМІЧНЕ ЗАВАНТАЖЕННЯ. ТЕКСТ 4 PADD 64 add 64 = (PADD 64) Get. Proc. Address (h, "_add 64@20"); PMUL 64 mul 64 = (PMUL 64) Get. Proc. Address (h, "_mul 64@20"); if (!add 64 | ! mul 64) Print. Error(Get. Last. Error()); else { i. Res = 0; ulong 64 a = 0 x. FFFFFFFFL, b = 0 x. FFFFFFFFL, c, d; unsigned carry = add 64 (a, b, &c); printf ("%I 64 x + %I 64 x = %x %I 64 xn", a, b, carry, c); d = mul 64 (a, b, &c); printf ("%I 64 x * %I 64 x = %I 64 x %16. 16 I 64 xn", a, b, d, c); } return i. Res } Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 23
DLL ТА DEF ФАЙЛИ • Недолік попередньої DLL: треба визначати ім'я DLL, яке формує компілятор з урахуванням режиму перезавантаження • Для формування довідника функцій в DLL та їх адрес використовується DEF файл, який додається до проекту DLL Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 24
ДОДАВАННЯ DEF ФАЙЛУ ДО ПРОЕКТУ DLL Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 25
DEF ФАЙЛ Склад DEF файлу LIBRARY “Імя DLL” "math 64 DLL" EXPORTS Ім'я функції (програмне) … DEF файл для math 64 DLL LIBRARY EXPORTS add 64 mul 64 Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва "math 64 DLL" 26
ГОЛОВНА ПРОГРАМА З ВИКОРИСТАННЯМ DLL З DEF ФАЙЛОМ. ДИНАМІЧНЕ ЗАВАНТАЖЕННЯ. ТЕКСТ 4 PADD 64 add 64 = (PADD 64) Get. Proc. Address (h, "add 64"); PMUL 64 mul 64 = (PMUL 64) Get. Proc. Address (h, "mul 64"); if (!add 64 | ! mul 64) Print. Error(Get. Last. Error()); else { i. Res = 0; ulong 64 a = 0 x. FFFFFFFFL, b = 0 x. FFFFFFFFL, c, d; unsigned carry = add 64 (a, b, &c); printf ("%I 64 x + %I 64 x = %x %I 64 xn", a, b, carry, c); d = mul 64 (a, b, &c); printf ("%I 64 x * %I 64 x = %I 64 x %16. 16 I 64 xn", a, b, d, c); } return i. Res } Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 27
ПОРІВНЯННЯ РІЗНИХ СПОСОБІВ ВИКОРИСТАННЯ DLL Статичне завантаження. Переваги 1. Простота використання функцій 2. Програма не почне виконуватись, якщо немає усіх необхідних DLL Динамічне завантаження. Переваги 1. Можливість визволення пам'яті, коли бібліотека більш не потрібна 2. Можливість використання однієї DLL в різних платформах 3. Можливість вказати місце знаходження DLL Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 28
ВІДКЛАДЕНЕ ЗАВАНТАЖЕННЯ DLL. ДЛЯ ЧОГО? • Статичний режим використання DLL – простий, але бібліотека залишається в памяті до кінця виконання додатку • Динамічний – можна завантажити і вивантажити бібліотеку, але складний в використанні • Для того щоб можна було завантажувати і вивантажувати, але використовувати статичний спосіб – відкладене завантаження Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 29
ВІДКЛАДЕНЕ ЗАВАНТАЖЕННЯ DLL. ЯК? 1. Властивості компоновщика: Properties→Linker →Input →Delay Loaded DLLs (через ; ) Properties→Linker →Advanced →Delay Loaded DLL →Support Unload (/DELAY: UNLOAD) 2 Підключити до модуля, де використовується функція вивантаження заголовчий файл #include
ВИСНОВКИ • • Бібліотеки застосовуються для повторного використання коду. Динамічна бібліотека має формат файлів для виконання, тому може використовуватися разом з програмою, яка її використовує. Треба уважно слідкувати за тим, яка саме бібліотека завантажується при умові наявності кількох різних екземплярів бібліотек. Середовище для розробки динамічних бібліотек та для програм, які використовують ці бібліотеки, можуть не співпадати, якщо використовується динамічний метод використання бібліотеки заголовків функцій бібліотеки. Бібліотека для використання може не завантажуватись, якщо попередній додаток вже її завантажив. Завантажувач повторно використовує бібліотеку тільки в тому разі, якщо повні імена бібліотек співпадають, тобто еквівалентність встановлюється не за змістом файлу а за його іменем. При використанні динамічних бібліотек в динамічному режимі необхідно обов'язково перевіряти успішність завантаження бібліотеки та визначення адрес функцій!!! Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 31
ПИТАННЯ ДЛЯ САМОСТІЙНОГО ВИВЧЕННЯ • Спосіб передачі в списку параметрів класів для функцій, що експортуються, для статичного завантаження бібліотеки • Спосіб передачі в списку параметрів класів для функцій, що експортуються, для динамічного завантаження бібліотеки Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 32
МАТЕРІАЛИ ДЛЯ ЕКСПРЕС-КОНТРОЛЮ • • Яки типи бібліотек Ви знаєте? Для чого використовуються бібліотеки Коли має сенс застосовувати динамічні бібліотеки? Які питання ви будете задавати постановнику задачі для вирішення питання необхідності розробляти статичну, динамічну бібліотеки, або не звичайний додаток? Які узгодження по виклику Ви знаєте, які узгодження рекомендується використовувати для бібліотек? В якому разі узгодження __stdcall не можна використовувати для бібліотеки? Коли використовується статичне або динамічне завантаження DLL? Що дає використання. def файлу для DLL? Операційні системи. Лекція 4. Кафедра ПІ. Качко О. , Дягілєва 33