- •Призначення ядра Linux і його особливості
- •Модулі ядра
- •Виконавча система
- •Наперед визначені системні процеси
- •Застосування користувача
- •Висновки до розділу 2.
- •Контрольні запитання та завдання
- •Паралелізм взаємодії з користувачем
- •Паралелізм розподілених застосувань
- •Ієрархія процесів
- •Особливості створення потоків
- •Особливості завершення потоків
- •Методи розподілюваної пам'яті
- •Методи передавання повідомлень
- •Технологія відображуваної пам'яті
- •Особливості міжпроцесової взаємодії
- •Черги повідомлень
- •20 Найбільш значущих бітів, які задають початкову адресу фрейму, кратну 4 Кбайт (може бути задано 1 Мбайт різних початкових адрес);
- •Перетворення адрес в архітектурі іа-32
- •Типи файлів
- •Імена файлів
- •Каталоги
- •Абсолютний і відносний шляхи
- •Єдине дерево каталогів. Монтування файлових систем
- •Літерні позначення розділів
- •Символічні зв'язки
- •Підтримка символічних зв'язків на рівні системних викликів
- •Фізична організація розділів на диску
- •Основні вимоги до фізичної організації файлових систем
- •Прості зв'язні списки.
- •Зв'язні списки з таблицею розміщення файлів
- •Розріджені файли
- •Елементи каталогу.
- •Спочатку інформацію зберігають у журналі (у ньому створюють новий запис). Таку операцію називають випереджувальним записуванням (write-ahead) або веденням журналу (journaling).
- •Необхідність реалізації буферизації
- •Способи реалізації буферизації
- •Буферизація і кешування
- •Використання спеціальних файлів
- •Передавання даних між рівнями підсистеми
- •Категорії драйверів пристроїв
- •Структура драйвера пристрою
- •Обслуговування переривань
- •Завершення запиту введення-виведення
- •Обробка даних багаторівневими драйверами
- •Поняття термінала
- •Емуляція термінала
- •Віддалені термінали і консоль
- •Термінальне введення
- •Термінальне виведення
- •Програмне керування терміналом
- •Наперед визначені дескриптори у Win32
- •Програмне керування консоллю
- •Протокол iPv4
- •Підтримка транспортного рівня
- •Однорідний доступ до пам'яті
- •Неоднорідний доступ до пам'яті
- •Асиметрична багатопроцесорність
- •Симетрична багатопроцесорність
- •Підтримка numa-архітектур
- •Масштабування навантаження
- •Продуктивність окремих застосувань
- •Криптографічні алгоритми
- •Обмін повідомленнями із використанням криптографії із секретним ключем
- •Криптографічні алгоритми з відкритим ключем
- •Обмін повідомленнями з використанням криптографії із відкритим ключем
- •Односторонні хеш-функції
- •Підписи із відкритим ключем і односторонніми хеш-функціями
- •Облікові записи
- •Словникові атаки і сіль
- •Аутентифікація за принципом «виклик-відповідь»
- •Списки контролю доступу
- •Можливості
Використання спеціальних файлів
Доступ до спеціального файла розглянемо на прикладі пристрою /dev/random, який можна використати як генератор випадкових чисел:
Unsigned int randval;
int randfd = open("/dev/random". 0_RD0NLY):
read(randfd, (char *)&randval, sizeof(randval));
printf(“випадкове значення: %u\n", randval);
Зазначимо, що, якщо спробувати зчитати великий обсяг даних із цього пристрою, операція читання може бути заблокована доти, поки користувач не виконає додаткових інтерактивних дій із системою (пересуне мишу, введе символи із клавіатури тощо), додаючи джерело випадковості. Якщо така затримка неприйнятна, можна використати пристрій /dev/urandom, операція читання з якого не може бути заблокована.
2.
Драйвер звичайно складається із коду ініціалізації, реалізації файлових операцій і оброблювачів переривань. Якщо драйвер не використовує введення-виве-дення, кероване перериваннями, а застосовує опитування пристрою, оброблювачі переривань у ньому можуть не реалізуватись. Далі припускатимемо, що буде використане введення-виведення на базі переривань.
Код ініціалізації виконують під час завантаження ядра (а також під час завантаження у пам'ять модуля із кодом драйвера, якщо він реалізований як модуль ядра). Він складається з однієї функції - і nit О. У ній відбувається реєстрація драйвера у системі (вибір номера драйвера, реєстрація оброблювачів переривань тощо). Зазначимо, що спеціальні файли мають створюватись окремо із режиму користувача утилітою mknod.
Код реалізації файлових операцій зводиться до набору функцій, що реалізують реакцію на виконання основних системних викликів файлового введення-виведення. Набір цих функцій розрізняють для блокових і символьних драйверів.
Для символьних можна реалізувати реакцію на виконання таких викликів, як openO, close( ), read( ), write( ), 1 seek ( ), select ( ) (для організації підтримки повідомлення), mmap( ).
Для блокових важливим є те, що реалізовані в них функції реакції на операції читання і записування викликають не прямо, а після того, як керування пройшло через буферний кеш (за наявності відповідного блоку в кеші операції його читання або записування можуть зовсім не викликатися). Читання і записування тут за традицією реалізовані у рамках однієї функції, позначеної в UNIX як strategy( ), а в Linux - request ( ).
Окремо слід виділити реалізацію реакції на універсальний системний виклик ioctl ( ), для якого треба продумати набір команд і необхідні структури даних.
Код оброблювачів переривань складається із верхньої (безпосередньо оброблювача) і нижньої половин. Під час реалізації та реєстрації цих частин потрібно використати визначені засоби підтримки, надані ядром. Верхня половина звичайно планує виконання нижньої і передає їй дані, нижня виконує основну обробку переривання. Виконання нижньої половини може бути відкладене до більш зручного часу.
3.
Приклад алгоритму обробки запиту введення-виведення в UNIX (не враховуючи особливості функціонування пристрою).
Процес користувача виконує системний виклик read() для спеціального файла пристрою, перед цим підготувавши буфер у своєму адресному просторі та передавши його адресу в цей системний виклик.
Відбувається перехід у привілейований режим для виконання коду драйвера пристрою. Як відомо, кожному процесові у привілейованому режимі доступна вся область даних ядра, тому цей перехід не спричиняє перемикання контексту — система продовжує виконувати той самий процес.
На підставі інформації, що зберігається в індексному дескрипторі спеціального файла, викликається функція, зареєстрована як реалізація файлової операції read О для відповідного драйвера.
Ця функція виконує необхідні підготовчі операції (наприклад, розміщує буфер у пам'яті ядра для збереження даних, отриманих від пристрою), відсилає контролеру пристрою запит на виконання операції читання та переходить у режим очікування (призупиняючи цим процес, що виконав операцію читання); для цього зазвичай використовують функцію sleep on().
Контролер читає дані із пристрою, можливо, заповнюючи буфер, наданий реалізацією реакції на read(). Коли читання завершене, він генерує переривання.
Апаратне забезпечення активізує верхню половину оброблювача переривання. Код верхньої половини ставить у чергу на виконання код нижньої половини.
Код нижньої половини заповнює даними буфер, якщо він не був заповнений контролером, виконує інші необхідні дії для завершення операції введення і поновлює виконання процесу, що очікує.
Після поновлення керування знову потрапляє в код реакції на read() — цього разу у фрагмент, що слідує за викликом функції sleep оп(). Цей код копіює дані із буфера ядра у буфер режиму користувача (код оброблювача цього зробити не може, оскільки він не має доступу до даних режиму користувача), після чого виконання системного виклику завершується. 9. Керування повертають у процес користувача.
4.
Базовим компонентом підсистеми введення-виведення Windows ХР є менеджер введення-виведення (I/O Manager). який розв'язує одну із найважливіших задач - передає дані між рівнями підсистеми.