- •1.1. Поняття операційної системи, її призначення та функції
- •1.1.1. Поняття операційної системи
- •1.1.2. Призначення операційної системи
- •1.1.3. Операційна система як розширена машина
- •1.1.4. Операційна система як розподілювач ресурсів
- •1.2. Історія розвитку операційних систем
- •1.3. Класифікація сучасних операційних систем
- •1.4. Функціональні компоненти операційних систем
- •1.4.1. Керування процесами й потоками
- •1.4.2. Керування пам'яттю
- •1.4.3. Керування введенням-виведенням
- •1.4.4. Керування файлами та файлові системи
- •1.4.5. Мережна підтримка
- •1.4.6. Безпека даних
- •1.4.7. Інтерфейс користувача
- •2.1. Базові поняття архітектури операційних систем
- •2.1.1. Механізми і політика
- •2.1.2. Ядро системи. Привілейований режим і
- •2.2. Реалізація архітектури операційних систем
- •2.2.1. Монолітні системи
- •2.2.2. Багаторівневі системи
- •2.2.3. Системи з мікроядром
- •2.2.4. Концепція віртуальних машин
- •2.3.1. Взаємодія ос і апаратного забезпечення
- •2.3.2. Взаємодія ос і виконуваного програмного коду
- •2.4.1. Базова архітектура unix
- •2.4.2. Архітектура Linux
- •2.5. Особливості архітектури: Windows хр
- •2.5.1. Компоненти режиму ядра
- •2.5.2. Компоненти режиму користувача
- •2.5.3. Об'єктна архітектура Windows хр
- •3.1. Базові поняття процесів і потоків
- •3.1.1. Процеси і потоки в сучасних ос
- •3.1.2. Моделі процесів і потоків
- •3.1.3. Складові елементи процесів і потоків
- •3.2. Багатопотоковість та її реалізація
- •3.2.1. Поняття паралелізму
- •3.2.2. Види паралелізму
- •3.2.3. Переваги і недоліки багатопотоковості
- •3.2.4. Способи реалізації моделі потоків
- •3.3. Стани процесів і потоків
- •3.4. Опис процесів і потоків
- •3.4.1. Керуючі блоки процесів і потоків
- •3.4.2. Образи процесу і потоку
- •3.5. Перемикання контексту й обробка переривань
- •3.5.1. Організація перемикання контексту
- •3.5.2. Обробка переривань
- •3.6. Створення і завершення процесів і потоків
- •3.6.1.Створення процесів
- •3.6.2.Ієрархія процесів
- •3.6.3.Керування адресним простором під час створення процесів
- •3.6.4. Особливості завершення процесів
- •3.6.5. Синхронне й асинхронне виконання процесів
- •3.6.6. Створення і завершення потоків
- •4.1. Загальні принципи планування
- •4.1.1. Особливості виконання потоків
- •4.1.2. Механізми і політика планування
- •4.1.3. Застосовність принципів планування
- •4.2. Види планування
- •4.2.1. Довготермінове планування
- •4.2.2. Середньотермінове планування
- •4.2.3. Короткотермінове планування
- •4.3. Стратегії планування. Витісняльна і невитісняльна багатозадачність
- •4.4. Алгоритми планування
- •4.4.1. Планування за принципом fifo
- •4.4.2. Кругове планування
- •4.4.3. Планування із пріоритетами
- •4.4.4. Планування на підставі характеристик подальшого виконання
- •4.4.5. Багаторівневі черги зі зворотним зв'язком
- •4.4.6. Лотерейне планування
- •4.5. Реалізація планування в Linux
- •4.5.1. Планування процесів реального часу в ядрі
- •6.1. Види міжпроцесової взаємодії
- •6.1.1.Методи розподілюваної пам'яті
- •6.1.2.Методи передавання повідомлень
- •6.1.3.Технологія відображуваної пам'яті
- •6.1.4.Особливості міжпроцесової взаємодії
- •6.2. Базові механізми міжпроцесової взаємодії
- •6.2.1. Міжпроцесова взаємодія на базі спільної пам'яті
- •6.2.2. Основи передавання повідомлень
- •6.2.3. Технології передавання повідомлень
- •8.1. Основи технології віртуальної пам'яті
- •8.1.1. Поняття віртуальної пам'яті
- •8.1.2. Проблеми реалізації віртуальної пам'яті. Фрагментація пам'яті
- •8.1.4. Підхід базового і межового регістрів
- •8.2. Сегментація пам'яті
- •8.2.1. Особливості сегментації пам'яті
- •8.2.2. Реалізація сегментації в архітектурі іа-32
- •8.3. Сторінкова організація пам'яті
- •8.3.1. Базові принципи сторінкової організації пам'яті
- •8.3.2. Порівняльний аналіз сторінкової організації пам'яті та сегментації
- •8.3.3. Багаторівневі таблиці сторінок
- •8.3.4. Реалізація таблиць сторінок в архітектурі іа-32
- •8.3.5. Асоціативна пам'ять
- •8.4. Сторінково-сегментна організація пам'яті
- •8.5. Реалізація керування основною пам'яттю: Linux
- •8.5.1. Використання сегментації в Linux. Формування логічних адрес
- •8.5.2. Сторінкова адресація в Linux
- •8.5.3. Розташування ядра у фізичній пам'яті
- •8.5.4.Особливості адресації процесів і ядра
- •8.5.5.Використання асоціативної пам'яті
- •8.6. Реалізація керування основною пам'яттю: Windows хр
- •8.6.1.Сегментація у Windows хр
- •8.6.2.Сторінкова адресація у Windows хр
- •8.6.3.Особливості адресації процесів і ядра
- •8.6.4. Структура адресного простору процесів і ядра
- •11.1. Поняття файла і файлової системи
- •11.1.1. Поняття файла
- •11.1.2.Поняття файлової системи
- •11.1.3.Типи файлів
- •11.1.4. Імена файлів
- •11.2. Організація інформації у файловій системі
- •11.2.1. Розділи
- •11.2.2. Каталоги
- •11.2.3. Зв'язок розділів і структури каталогів
- •11.3. Зв'язки
- •11.3.1. Жорсткі зв'язки
- •11.3.2. Символічні зв'язки
- •11.4. Атрибути файлів
- •11.5. Операції над файлами і каталогами
- •11.5.1. Підходи до використання файлів процесами
- •12.1. Базові відомості про дискові пристрої
- •12.1.1. Принцип дії жорсткого диска
- •12.1.2. Ефективність операцій доступу до диска
- •12.2. Розміщення інформації у файлових системах
- •12.2.1. Фізична організація розділів на диску
- •12.2.2. Основні вимоги до фізичної організації файлових систем
- •12.2.3. Неперервне розміщення файлів
- •12.2.4. Розміщення файлів зв'язними списками
- •12.2.5. Індексоване розміщення файлів
- •12.2.6. Організація каталогів
- •15.1. Завдання підсистеми введення-виведення
- •15.1.1. Забезпечення ефективності доступу до пристроїв
- •15.1.2. Забезпечення спільного використання зовнішніх пристроїв
- •15.1.3. Універсальність інтерфейсу прикладного програмування
- •15.1.4. Універсальність інтерфейсу драйверів пристроїв
- •15.2. Організація підсистеми введення-виведення
- •15.2.1. Символьні, блокові та мережні драйвери пристроїв
- •15.2.2. Відокремлення механізму від політики за допомогою
- •15.3. Способи виконання операцій введення-виведення
- •15.3.1. Опитування пристроїв
- •15.3.2. Введення-виведення, кероване перериваннями
- •15.3.3. Прямий доступ до пам'яті
- •15.4. Підсистема введення-виведення ядра
- •15.4.1. Планування операцій введення-виведення
- •15.4.2. Буферизація
- •15.7. Керування введенням-виведенням: unix і Linux
- •15.7.1. Інтерфейс файлової системи
- •15.7.2. Передавання параметрів драйверу
- •15.7.3. Структура драйвера
- •15.7.4. Виконання операції введення-виведення для пристрою
- •15.8. Керування введенням-виведенням: Windows хр
- •15.8.1. Основні компоненти підсистеми введення-виведення
- •15.8.2. Виконання операції введення-виведення для пристрою
- •15.8.3. Передавання параметрів драйверу пристрою
- •17.1. Термінальне введення-виведення
- •17.1.1. Організація термінального введення-виведення
- •17.1.3. Термінальне введення-виведення у Win32 api
- •17.2. Командний інтерфейс користувача 17.2.1.
- •17.2.2. Переспрямування потоків введення-виведення
- •17.2.3. Використання каналів
- •17.3. Графічний інтерфейс користувача
- •17.3.1. Інтерфейс віконної та графічної підсистеми Windows хр
- •17.3.2. Система X Window
- •17.4. Процеси без взаємодії із користувачем
- •17.4.1. Фонові процеси на основі posix
- •17.4.2. Служби Windows хр
- •16.1. Загальні принципи мережної підтримки
- •16.1.1. Рівні мережної архітектури і мережні сервіси
- •16.1.2. Мережні протоколи
- •16.2. Реалізація стека протоколів Інтернету
- •16.2.1. Рівні мережної архітектури tcp/ip
- •16.2.2. Канальний рівень
- •16.2.3. Мережний рівень
- •16.2.4. Транспортний рівень
- •16.2.5. Передавання даних стеком протоколів Інтернету
- •16.3. Система імен dns
- •16.3.1. Загальна характеристика dns
- •16.3.2. Простір імен dns
- •16.3.3. Розподіл відповідальності
- •16.3.4. Отримання ір-адрес
- •16.3.5. Кешування ір-адрес
- •16.3.6. Типи dns-ресурсів
- •16.4. Програмний інтерфейс сокетів Берклі
- •16.4.1. Особливості роботи з адресами
- •16.4.2. Створення сокетів
- •16.4.3. Робота з потоковими сонетами
- •16.4.4. Введення-виведення з повідомленням
- •19.1. Загальні принципи завантаження ос
- •19.1.1. Апаратна ініціалізація комп'ютера
- •19.1.2. Завантажувач ос
- •19.1.3. Двоетапне завантаження
- •19.1.4. Завантаження та ініціалізація ядра
- •19.1.5. Завантаження компонентів системи
- •19.2. Завантаження Linux
- •19.2.1. Особливості завантажувача Linux
- •19.2.2. Ініціалізація ядра
- •19.2.3. Виконання процесу init
- •19.3. Завантаження Windows хр
- •20.1. Багатопроцесорні системи
- •20.1.1. Типи багатопроцесорних систем
- •20.1.2. Підтримка багатопроцесорності в операційних системах
- •20.1.3. Продуктивність багатопроцесорних систем
- •20.1.4. Планування у багатопроцесорних системах
- •20.1.5. Спорідненість процесора
- •20.1.6. Підтримка багатопроцесорності в Linux
- •20.1.7. Підтримка багатопроцесорності у Windows хр
- •20.2. Принципи розробки розподілених систем
- •20.2.1. Віддалені виклики процедур
- •20.2.2. Використання Sun rpc
- •20.2.3. Використання Microsoft rpc
- •20.2.4. Обробка помилок і координація в розподілених системах
- •20.3. Розподілені файлові системи
- •20.3.1. Організація розподілених файлових систем
- •20.3.2. Файлова система nfs
- •20.3.3. Файлова система Microsoft dfs
- •20.4. Сучасні архітектури розподілених систем
- •20.4.1. Кластеры системи
- •20.4.2. Grid-системи
- •18.1. Основні завдання забезпечення безпеки
- •18.2. Базові поняття криптографії
- •18.2.1. Поняття криптографічного алгоритму і протоколу
- •18.2.2. Криптосистеми з секретним ключем
- •18.2.3. Криптосистеми із відкритим ключем
- •18.2.4. Гібридні криптосистеми
- •18.2.5. Цифрові підписи
- •18.2.6. Сертифікати
- •18.3. Принципи аутентифікаціїі керування доступом
- •18.3.1. Основи аутентифікації
- •18.3.2. Основи керування доступом
- •18.4. Аутентифікація та керування доступом в unix
- •18.4.1. Облікові записи користувачів
- •18.4.2. Аутентифікація
- •18.4.3. Керування доступом
- •18.5. Аутентифікація і керування доступом у Windows xp
- •18.5.1. Загальна архітектура безпеки
- •18.5.2. Аутентифікація
- •18.5.3. Керування доступом
- •18.6. Аудит
- •18.6.1. Загальні принципи організації аудиту
- •18.6.2. Робота із системним журналом unix
- •18.6.3. Журнал подій Windows xp
- •18.7. Локальна безпека даних
- •18.7.1. Принципи шифрування даних на файлових системах
- •18.7.2. Підтримка шифрувальних файлових систем у Linux
- •18.7.3. Шифрувальна файлова система Windows xp
- •18.8. Мережна безпека даних
- •18.8.1. Шифрування каналів зв'язку
- •18.8.2. Захист інформації на мережному рівні
- •18.8.3. Захист інформації на транспортному рівні
- •18.9. Атаки і боротьба з ними
- •18.9.1. Переповнення буфера
- •18.9.2. Відмова від обслуговування
- •18.9.3. Квоти дискового простору
- •18.9.4. Зміна кореневого каталогу застосування
20.2.2. Використання Sun rpc
Однією із найрозповсюдженіших реалізацій RPC-технології для UNIX-систем є Sun RPC [37, 52]. До її особливостей належить реалізація на основі TCP/IP, незалежність від відображення даних на клієнті та сервері (за перетворення між типами відповідає бібліотека часу виконання RPC).
Розробка файла специфікацій RPC
У документації Sun RPC не вживають терміна IDL, однак аналоги IDL-файлів і IDL-компілятора є. IDL-файлами виступають файли специфікацій RPC (із розширенням .х), які обробляє спеціальна утиліта грсдеп.
Насамперед у файлі специфікацій RPC задають типи даних, які використовують як параметри. Частина типів відповідає стандартним типам мови С, наприклад, int або long, рядковий тип визначають як string, максимальну довжину рядка задають у кутових дужках. Складні типи даних задають структурами (теж визначеними за правилами мови С). Часто простим типам ставлять у відповідність структури, що містять єдине поле.
Крім того, у цьому файлі задають специфікацію RPC-застосування. Вона багато в чому подібна до опису інтерфейсу (набір оголошень процедур, об'єднаних спільним іменем). Кожній процедурі присвоюють номер, унікальний у межах специфікації, всьому застосуванню відповідає номер версії та номер застосування (program number), що є 32-бітним числом, яке унікально ідентифікує RPC-cep-вер у рамках системи. Для серверів користувача цей номер має бути в діапазоні 0x20000000- 0x3FFFFFFF.
Наведемо приклад файла специфікацій RPC для задання однієї процедури з одним параметром (припустимо, що цей файл має назву myrpc.x).
/* тип даних для параметра процедури */
struct msg {
string text ;
}:
/* специфікація застосування */
program HELL0PR0G { /* ім'я застосування */
version HELL0_VER { /* ім'я версії */
/* оголошення процедури із заданням номера */
void SAYHELLO(msg) - 1:
} = 1; /* номер версії */
} - 20000010; /* номер застосування */
Ім'я застосування і версії, а також імена процедур прийнято задавати у верхньому регістрі. Під час генерації заглушок ім'я процедури переводиться до нижнього регістра.
Файл специфікацій RPC має оброблятися утилітою rpcgen:
$ rpcgen myrpc.x
Унаслідок цього на основі myrpc.x утворяться такі файли:
♦ myrpc.h - оголошення віддалених процедур і типів, які будуть використані у застосуваннях;
♦ myrpc_clnt.c, myrpc_svc.c - коди клієнтської та серверної заглушок;
♦ myrpc_xdr.c - код перетворення типів у формат зовнішнього відображення (XDR), придатний для пересилання мережею (цей файл компонується разом із клієнтом і сервером).
Служба відображення портів Sun RPC
Ця служба є деяким аналогом служби іменування. Вона відповідає за відображення між номерами застосувань і TCP або UDP-портами та реалізована як фоновий процес, який звичайно називають portmapper.
Реєструють застосування із використанням його номера (це зазвичай відбувається під час запуску застосування). Під час реєстрації також задають номер порту; у більшості випадків автоматично вибирають деякий вільний порт, який далі використовуватиме це серверне застосування.
Перед викликом віддаленої процедури клієнт має зв'язатися зі службою відображення портів на відповідному хості (із використанням наперед відомого порту з номером 111), передати їй номер застосування і отримати у відповідь номер порту, через який можна обмінюватися даними із цим застосуванням.
Отримати інформацію про зареєстровані застосування можна за допомогою утиліти rpcinfo.
$ rpcinfo -р ім'я_хоста
Розробка віддалених процедур
Прототип реалізації віддаленої процедури відрізняється від її прототипу, оголошеного у файлі специфікації:
♦ до імені процедури додають суфікс номер-Bepciïsvc, наприклад, процедура sayhelloO має бути реалізована як sayhel 1 o_l_svc( );
♦ усі параметри і повернене значення замінюють відповідними покажчиками (string при цьому відповідає char *);
♦ як додатковий останній параметр задають покажчик на структуру svcreq, яку передає у процедуру бібліотека часу виконання і яка містить інформацію про контекст виклику.
Наведемо приклад коду віддаленої процедури:
finclude "myrpc.h"
void * sayhello_l_svc(msg *argp, struct svc_req *rqstp) { static char *result = { 0 }; printfC'eifl клієнта: ïs\n", argp->text); return (void *) result:
}
Розробка сервера
Особливістю Sun RPC є те, що у разі використання утиліти rpcgen жодних додаткових кроків для розробки сервера, крім створення коду віддалених процедур, робити не потрібно. Код функції maiп{ ) для сервера, поряд із кодом серверної заглушки, генерує rpcgen і поміщає у файл myhello_svc.c. Цей код автоматично реєструє сервер у службі відображення портів, переводить його у фоновий режим і переходить до очікування з'єднань.
Під час компіляції та компонування сервера потрібно використовувати файли із визначеннями збережених процедур, файл серверної заглушки myhello_svc.c і файл XDR-перетворень myhello_xdr.c.
Розробка клієнта
Перед викликом процедури на віддаленому сервері в коді клієнта необхідно отримати клієнтський дескриптор, що буде використаний далі для виклику збережених процедур із сервера. Цей дескриптор є покажчиком на спеціальну структуру CLIENT. Для його отримання використовують функцію clnt_create()
#finclude <rpc/rpc.h>
CLIENT *clnt_create(const char *host. unsigned long pnum.
unsigned long ver. const char *protocol);
де: host — ім'я або IP-адреса віддаленого хоста;
pnum - номер застосування (у заголовному файлі, згенерованому rpcgen, для нього визначають відповідну константу, наприклад HELL0PR0G);
ver - номер версії (для нього визначають аналогічну константу, наприклад
HELL0_VER);
protocol — рядок із назвою протоколу ("tcp", "udp").
Заголовний файл <rpc/rpc.h> буде автоматично підключений у myrpc.h, тому явно підключати його не обов'язково.
#include "myrpc.h" CLIENT *cl;
cl = clnt_create("myserver". HELL0_PR0G. HELLCM/ER. "tcp");
Після отримання клієнтського дескриптора можна викликати віддалену процедуру. Для цього викликають процедуру і м ' я_номер_версіі ( ): для процедури sayhel 1о() треба викликати sayhel 1о_1(). Усі аргументи передають у цю функцію як покажчики, останнім аргументом додатково задають клієнтський дескриптор.
struct msg hello - { "hello world" };
void *res = sayhello_l(&hello. cl);
Виклик віддаленої процедури може повернути NULL: це означає, що сталася помилка. Рядок з інформацією про помилку в цьому разі повертає функція clntsper-гогО, що першим параметром приймає клієнтський дескриптор, а другим — ім'я віддаленого хоста:
if (res == NULL)
printfCTloMHflKa: %s\n". clnt_sperror(cl, "myserver")) :
Забезпечення безпеки даних у разі використання Sun RPC
Для забезпечення безпеки даних у разі використання RPC застосовують аутенти-фікацію RPC-клієнтів перед доступом до сервера. Є кілька рівнів такої аутенти-фікації.
Рівень AUTH NONE (використовуваний за замовчуванням) означає, що аутентифікації не виконують зовсім. Відповідно до нього будь-який клієнт у мережі, що може відсилати пакети RPC-серверу, має змогу викликати будь-яку реалізовану ним процедуру. Цей рівень не забезпечує ніякого захисту і не рекомендований до використання.
Рівень AUTHUNIX означає, що кожний RPC-запит супроводжується ідентифікатором користувача (uid) і набором ідентифікаторів груп (gid). Мається на увазі, що ці ідентифікатори відповідають користувачу, який запустив клієнтське застосування, і що сервер довіряє цьому користувачу.
Для використання такої аутентифікації на клієнті після виклику clnt_create( ) необхідно виконати код
// CLIENT *cl = clntcreate(...)
authdestroy(cl ->cl_auth) ;
cl->cl_auth = authsyscreatedefaultO ; // задання AUTHJJNIX
Цей рівень теж не зовсім відповідає сучасним уявленням про мережну безпеку, оскільки зловмисник може створювати і відсилати RPC-пакети із довільними значеннями uid і gid, і їхнє авторство не може бути перевірене сервером. Наприклад, коли відомо, який користувач потрібен для виконання необхідних процедур, і в мережі є комп'ютер, на якому зловмисник має права root, він може створити користувача із необхідним uid і виконувати RPC-запити клієнтським процесом, запущеним під цим користувачем. Такі запити будуть успішно виконані, хоча пароль потрібного користувача RPC-сервера зловмисникові невідомий.
Рівень AUTH_DES використовує гібридну криптосистему для організації захищеного каналу зв'язку для RPC-виклику. Реалізація такого рівня аутентифікації відома як Secure RPC.
]