Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вступ, ст 22-93.doc
Скачиваний:
5
Добавлен:
02.09.2019
Размер:
1.62 Mб
Скачать

Системні виклики

Інтерфейс між операційною системою та програмами користувача визначається набором системних викликів, що надаються операційною системою.

Щоб насправді зрозуміти, що ж робить, операційна система, ми повинні

детально розглянути цей інтерфейс. Системні виклики, доступні в інтерфейсі, змінюються від однієї операційної системи до іншої (хоча лежить в їх основі

концепція практично однакова). Тепер ми зіткнулися з проблемою вибору між A і В) невизначеними узагальненнями («операційні системи мають системні виклики для читання файлів») будь-якої конкретної системою («в UNIX існує системний виклик для читання з трьома параметрами: Один для завдання файлу, другий - для того, щоб вказати, куди потрібно помістити прочитані дані, третій задає кількість

байтів, яке потрібно прочитати »). Ми вибрали другий підхід. При цьому способі потрібно виконати більше роботи, але він забезпечує краще розуміння того, що в реальності відбувається в операційній системі. Незважаючи на те що це обговорення зачіпає конкретно стандарт POSIX (міжнародний стандарт 9945-1), а, отже, також і операційні системи UNIX, System V, BSD, Linux, MINIX і т. д., У

більшості інших сучасних операційних систем є системні виклики, виконують ті ж самі функції, хоча деталі можуть бути різні. Так як фактичний механізм звернення до системних функцій є у високій ступеня машинно-залежним і часто має реалізовуватися на асемблері, існують бібліотеки процедур, які роблять можливим звернення до системних процедурам з програм на С та іншими мовами з теле же успіхом.

Дуже корисно завжди пам'ятати наступне. Будь-який комп'ютер з одним процесором в кожен конкретний момент часу може виконати тільки одну

команду. Якщо процес виконує програму користувача в користувальницькому режимі і потребує системної службі, наприклад читанні даних з файлу, він повинен виконати переривання або команду системного виклику для передачі

управління операційній системі. Потім операційна система за параметрами виклику визначає, що потрібно зухвалому процесу. Після цього вона обробляє

системний виклик і повертає керування команді, наступної за системним

викликом. У відомому сенсі виконання системного виклику схоже на здійснення виклику процедури, тільки перший проникає в ядро, а другий цього не

робить.

Для того щоб прояснити механізм системних викликів, коротко розглянемо

системний виклик read. Як згадувалося вище, у нього є три параметри: Перший

служить для завдання файлу, другий вказує на буфер, третій задає кількість

байтів, яке потрібно прочитати. Як практично всі системні виклики, він запускається з програми на С за допомогою виклику бібліотечної процедури з тим

же ім'ям, що і системний виклик: read. Виклик з програми на С може виглядати так:

count = readCfd. buffer, nbytes):

Системний виклик (і бібліотечна процедура) повертає кількість дійсно прочитаних байтів у змінній count. Зазвичай ця величина збігається з параметром nbytes, але може бути менше, якщо, наприклад, в процесі читання процедурі зустрівся кінець файлу. Якщо системний виклик не може бути виконаний або через неправильні параметрів або через дискової помилки, значення лічильника count встановлюється рівним -1, а номер помилки поміщається в глобальну змінну етго. Програми завжди повинні перевіряти результат системного виклику, щоб відстежувати поява помилки. Системні виклики виконуються за серію кроків. Повернемося до згадуваному вище прикладу виклику read для того, щоб роз'яснити цей момент. Спочатку при підготовці до виклику бібліотечної процедури read, яка фактично здійснює системний виклик read, що викликає програма поміщає параметри в стек, як показано в кроках 1-3 нарис. 1.17. Компілятори С і C поміщають параметри в стек у зворотному порядку, так історично склалося (щоб першим був параметр ллярпИ /, тобто рядок формату опинилася на вершині стека). Перший і третій параметри передаються за значенням, а другий параметр передається за посиланням, тобто передається адреса буфера (на те, що це посилання, вказує символ), а не його вміст. Потім слід власне виклик бібліотечної процедури (крок 4). Ця команда процесора являє собою звичайну команду виклику процедури і застосовується для виклику будь-яких процедур.

Бібліотечна процедура, можливо, написана на асемблері, зазвичай поміщає номер системного виклику туди, де його чекає операційна система, наприклад в регістр (крок 5). Потім вона виконує команду TRAP (емулювати переривання) для перемикання з режиму користувача в режим ядра і починає виконання фіксованого адреси всередині ядра (крок 6). Запускається програма ядра перевіряє номер системного виклику і потім відправляє його потрібного обробникові, як правило, використовуючи таблицю покажчиків на обробники системних викликів, індексовану за номерами викликів (крок 7). У цьому місці починає функціонувати обробник системних викликів (крок 8). Як тільки він завершує свою роботу, управління може повертатися в простір користувача до бібліотечної процедурою, до команди, наступної за командою TRAP (крок 9). Ця процедура в свою чергу передає управління програмі користувача звичайним способом, яким здійснюється повернення з викликаної процедури (крок 10). Щоб закінчити роботу, програма користувача повинна очистити стек, як це робиться і після кожного виклику процедури (крок 11). Враховуючи, що стек росте вниз, остання команда збільшує покажчик стека рівно настільки, наскільки потрібно для видалення параметрів, поміщених в стек перед запитом read. Тепер програма може продовжувати свою роботу.

Рис. 1.17. 11 етапів виконання системного виклику read (fd, buffer, nbytes)

На кроці 9 ми використовували вираз «може повертатися в простір

користувача до бібліотечної процедурі ... »не просто так. Системний виклик

може блокувати викликала його процедуру, перешкоджаючи продовження її

роботи. Наприклад, якщо вона намагається прочитати щось із клавіатури, а там ще нічого не набрано, процедура повинна бути блокована. У цьому випадку операційна система шукає процес, який може бути запущений наступним. Пізніше, коли потрібний пристрій стане доступно, система згадає про блокова-ному процесі і кроки 9-11 будуть виконані.

У наступних розділах ми розглянемо деякі з найбільш часто застосовуються системних викликів стандарту POSIX або, точніше, бібліотечних процедур, які виконують ці виклики. У POSIX існує більше 100 процедурних дзвінків. Частина найбільш важливих процедурних викликів представлена ​​в табл. 1.1, де вони для зручності розподілені в чотири групи. Далі ми коротко опишемо кожен виклик і його дія. Служби, що надаються цими викликами, в значній значною мірою визначають дії операційної системи, так як управління ресурсами на персона-льному комп'ютері мінімально (принаймні, порівняно з великим машинами, на яких працюють декілька користувачів). До цих служб належать такі функції, як створення і завершення процесів, створення, видалення, читання і запис файлів, управління каталогами, виконання введення і виведення.

Таблиця 1.1. Деякі з основних системних викликів POSIX

Особливу увагу слід звернути на те, що перетворення викликів процедур POSIX в системні виклики не є взаємно однозначним. Стандарт POSIX визначає ряд процедур, які повинні підтримувати сумісні системи, але він не вказує, чи є вони системними викликами, бібліотечними викликами або чим-небудь ще. Якщо процедуру можна виконати без системного виклику (тобто без перемикання в режим роботи ядра), то зазвичай вона рацює в просторі користувача, тому що так швидше. Однак більшість процедур POSIX виконує системні виклики, звичайно з однією процедурою,перетвориться безпосередньо в системний виклик. У деяких випадках, особливо коли необхідні процедури є всього лише різновидами один одного, один системний виклик обробляє відразу декілька бібліотечних викликів.