Запити до драйвера
Обробку запиту можна розділити на три фази: передобробку, виконання запиту і обробку
поста. Призначена для користувача програма запрошує операцію,
виконуючи відповідний системний виклик. У ОС сімейства Unix це може
бути, наприклад, системний виклик write (int file, void
* buffer, size_t size) .
Передобробка виконується модулем системи, який, як правило,
виконується в нитці процесу, що сформувала запит, але має привілеї
ядра. Фаза передобробки включає.
- Перевірку допустимості параметрів.
Користувач повинен мати право виконувати запитану операцію над даним
пристроєм, адреса буфера має бути допустимою адресою призначеного для
користувача адресного простору і так далі
- Можливо, копіювання або
відображення даних з призначеного для користувача адресного простору в
системний.
- Можливо, перетворення даних, що
виводяться. Наприклад, в системах сімейства Unix при виводі на термінал
система може замінювати символ горизонтальної табуляції на відповідне
число пропусків (якщо термінал не підтримує горизонтальну табуляцію) і
перетворювати символ перекладу рядка. Річ у тому, що усередині системи
як роздільник рядків використовується символ нового рядка '\n' (ASCII
NL), а різні моделі терміналів і принтерів можуть використовувати також
'\r' (ASCII RET, повернення каретки) або послідовності '\r"\n' або
'\n"\r'.
- Можливо, звернення до процедур
драйвера. Ці процедури можуть блокувати код і дані драйвера у фізичній
пам'яті і виділяти буфери для ПДП. Ці операції реалізуються
нереєнтерабельними сервісами ядра і не завжди можуть бути виконані
драйвером під час обробки запиту.
- Передача запиту драйверу. Деякі
системи реалізують передачу запиту як простий виклик відповідної
функції драйвера, але частіше використовуються складніші асинхронні механізми, які
обговорюватиметься далі.
Виконавши запит, драйвер активізує програму
обробки поста, котопя аналізує результат операції, робить
ті або інші дії з відновлення в разі невдачі,
копіює або відображує отримані дані в призначений для користувача
адресний простір і оповіщає призначений для користувача
процес про завершення запиту.
Деякі системи на цій фазі також ыыпроизводят перетворення введених
даних. Як приклад можна знов привести системи сімейства Unix, які
при введенні з терміналу виконують трансляцію символу перекладу рядка і
ряд інших операцій редагування, наприклад, стирання останнього введеного символу
по запиту користувача. Розбиття потоку термінальних даних на
рядки в цих системах також відбувається на фазі обробки поста.
У тій або іншій формі ці три фази обробки запиту
введення-виводу присутньо у всіх багатопотокових і навіть багатьох
однопоточних системах.
|