
- •Практичне заняття 8 Організація уведення-виведення в unix. Файли пристроїв. Апаратні переривання
- •Операції над файловими системами. Монтування файлових систем
- •Блокові, символьні пристрої. Поняття драйвера. Блокові, символьні драйвери, драйвери низького рівня. Файловий інтерфейс
- •Апаратні переривання (interrupt), виключення (exception), програмні переривання (trap, software interrupt). Їх обробка
- •Поняття сигналу. Способи виникнення сигналів і види їх обробки
- •Поняття групи процесів, сеансу, лідера групи, лідера сеансу, управляючого терміналу сеансу. Системні виклики getpgrp(), setpgrp(), getpgid(), setpgid(), getsid(), setsid()
- •Системний виклик kill() і команда kill
- •Вивчення особливостей отримання термінальних сигналів поточною і фоновою групою процесів
- •Системний виклик signal(). Установка власного обробника сигналу
- •Прогін програми, що ігнорує сигнал sigint
- •Прогін програми з призначеною для користувача обробкою сигналу sigint
- •Відновлення попередньої реакції на сигнал
- •Сигнали sigusr1 і sigusr2. Використовування сигналів для синхронізації процесів
- •Завершення породженого процесу. Системний виклик waitpid(). Сигнал sigchld
- •Прогін програми для ілюстрації обробки сигналу sigchld
- •Виникнення сигналу sigpipe при спробі запису в pipe або fifo, який ніхто не збирається читати
- •Поняття про надійність сигналів. Posix функції для роботи з сигналами
- •Питання до захисту роботи
Блокові, символьні пристрої. Поняття драйвера. Блокові, символьні драйвери, драйвери низького рівня. Файловий інтерфейс
Маючи знання про устрій сучасних файлових систем в UNIX, ми можемо, нарешті, зайнятися питаннями реалізації підсистеми уведення-виведення.
В лекції 13 (розділ "Структура системи уведення-виведення") мова йшла про те, що всі пристрої уведення-виведення можна розділити на відносно невелике число типів, залежно від набору операцій, які можуть ними виконуватися. Такий розподіл дозволяє організувати "шарувату" структуру підсистеми уведення-виведення, винісши всі апаратно-залежні частини в драйвери пристроїв, з якими взаємодіє базова підсистема уведення-виведення, що здійснює стратегічне управління всіма пристроями.
В операційній системі UNIX прийнята спрощена класифікація пристроїв (див. лекцію 13, розділ "Систематизація зовнішніх пристроїв і інтерфейс між базовою підсистемою уведення-виведення і драйверами"): всі пристрої розділяються за способом передачі даних на символьні і блокові. Символьні пристрої здійснюють передачу даних байт за байтом, тоді як блокові пристрої передають блок байт як єдине ціле. Типовим прикладом символьного пристрою є клавіатура, прикладом блокового пристрою – жорсткий диск. Безпосередню взаємодію операційної системи з пристроями уведення-виведення забезпечують їх драйвери. Існує п'ять основних випадків, коли ядро звертається до драйверів:
Автоконфігурація. Відбувається в процесі ініціалізації операційної системи, коли ядро визначає наявність доступних пристроїв.
Уведення-виведення. Обробка запиту уведення-виведення.
Обробка переривань. Ядро викликає спеціальні функції драйвера для обробки переривання, що поступило від пристрою, у тому числі, можливо, для планування черговості запитів до нього.
Спеціальні запити. Наприклад, зміна параметрів драйвера або пристрою.
Повторна ініціалізація пристрою або останов операційної системи.
Так само як пристрої підрозділяються на символьні і блокові, драйвери теж існують символьні і блокові. Особливістю блокових пристроїв є можливість організації на них файлової системи, тому блокові драйвери звичайно використовуються файловою системою UNIX. При зверненні до блокового пристрою, що не містить файлової системи, застосовуються спеціальні драйвери низького рівня, як правило, є інтерфейсом між ядром операційної системи і блоковим драйвером пристрою.
Для кожного з цих трьох типів драйверів були виділені основні функції, які базова підсистема уведення-виведення може скоювати над пристроями і драйверами: ініціалізація пристрою або драйвера, тимчасове завершення роботи пристрою, читання, запис, обробка переривання, опит пристрою і т.д. (про ці операції вже мовилося в лекції 13, розділ "Систематизація зовнішніх пристроїв і інтерфейс між базовою підсистемою уведення-виведення і драйверами"). Ці функції були систематизовані і є інтерфейсом між драйверами і базовою підсистемою уведення-виведення.
Кожний драйвер певного типу в операційній системі UNIX одержує власний номер, який по суті справи є індексом в масиві спеціальних структур даних операційної системи – комутаторі пристроїв відповідного типу. Цей індекс прийнято також називати старшим номером пристрою, хоча насправді він відноситься не до пристрою, а до драйвера. Не дивлячись на наявність трьох типів драйверів, в операційній системі використовується всього два комутатори: для блокових і символьних драйверів. Драйвери низького рівня розподіляються між ними по переважаючому типу інтерфейсу (до якого типу ближче – в такий масив і заносяться). Кожний елемент комутатора пристроїв обов'язково містить адреси (точки входу в драйвер), відповідні стандартному набору функцій інтерфейсу, які і викликаються операційною системою для виконання тих або інших дій над пристроєм і/або драйвером.
Крім старшого номера пристрою існує ще і молодший номер пристрою, який передається драйверу як параметр і значення якого визначається самим драйвером. Наприклад, це може бути номер розділу на жорсткому диску (partition), доступ до якого повинен забезпечити драйвер (треба відзначити, що в операційній системі UNIX різні розділи фізичного носія інформації розглядаються як різні пристрої). В деяких випадках молодший номер пристрою може не використовуватися, але для одноманітності він повинен бути присутній. Таким чином, пара драйвер-пристрій завжди однозначно визначається в операційній системі завданням пари номерів (старшого і молодшого номерів пристрою) і типу драйвера (символьний або блоковий).
Для зв'язку додатків з драйверами пристроїв операційна система UNIX використовує файловий інтерфейс. В числі типів файлів на попередньому семінарі згадувалися спеціальні файли пристроїв. Так от, кожній трійці тип-драйвер-пристрій у файловій системі відповідає спеціальний файл пристрою, який не займає на диску ніяких логічних блоків, окрім індексного вузла. Як атрибути цього файлу крім звичайних атрибутів використовуються відповідні старший і молодший номери пристрою і тип драйвера (тип драйвера визначається по типу файлу: бо є спеціальні файли символьних пристроїв і спеціальні файли блокових пристроїв, а номери пристроїв займають місце довжини файлу, скажімо, для регулярних файлів). Коли відкривається спеціальний файл пристрою, операційна система, в числі інших дій, заносить у відповідний елемент таблиці відкритих віртуальних вузлів покажчик на набір функцій інтерфейсу з відповідного елемента комутатора пристроїв. Тепер при спробі читання з файлу пристрою або запису у файл пристрою віртуальна файлова система транслюватиме запити на виконання цих операцій у відповідні виклики потрібного драйвера.
Ми не зупинятимемося на практичному вживанні файлового інтерфейсу для роботи з пристроями уведення-виведення, оскільки це виходить за межі нашого курсу, а натомість приступимо до викладу концепції сигналів в UNIX, тісно пов'язаних з поняттями апаратного переривання, виключення і програмного переривання.