Виклики syscall

Системні виклики (часто звані syscall в ОС Linux) зазвичай реалізуються у вигляді виклику функції Для них можуть бути визначені один або більше аргументів (inputs), які можуть призводити до тих чи інших побічним еффектам3, наприклад до запису даних у файл або до копіювання деяких даних в область памяті, на яку вказує переданий покажчик Системні виклики також мають значення, що повертається типу long 4, яке вказує на успішність виконання операції або на виниклі помилки Зазвичай, але не завжди, повернення відємного значення вказує на те, що сталася помилка Повернення нульового значення звичайно (але не завжди) вказує на успішність виконання операції Системні виклики ОС Unix в разі помилки записують спеціальний код помилки в глобальну змінну errno Значення цієї змінної може бути переведено в легку для читання формy за допомогою бібліотечної функції perro r ()

Системні виклики, звичайно, мають певну поведінку Наприклад, системний виклик getpi d () визначений для того, щоб повертати цілочисельне значення, рівне значенню ідентифікатора PID поточного процесу Реалізація цієї функції в ядрі дуже проста

3Следует зверне ь внимани е на слово можуть. Хоча майже ВГЕ виклики створюють різні е побічні ефект и (тобто призводять до яких-небудь іемененіям в стані системи), тим Проте невелика кількість викликів, як, наприклад, викликgetpid (), Просто повертають деякими е дані ядра

4Тіпlong використовується для сумісності з 64-розрядними платформами

asmlinkage long sys_getpid(void)

{

return current-&gttgid

)

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

Навіть з такого приклад а можна зробити пару спостережень, якими е стосуються системних викликів По-перше, слід звернути увагу на модифікатор asmlinkag e в оголошенні функції Це чарівне слово дає компілятору інформацію про те, що звернення до аргументів цієї функції повинно проводитися тільки через стек Для всіх системних викликів використання цього модифікатора є обовязковим По-друге, слід звернути увагу, що системний виклик getpi d () оголошений в ядрі, як sys_getpi d () Це угода про присвоєнні імен використовується для всіх системних викликів операційної системи Linux: системний виклик ba r () повинен бути реалізований за допомогою функції sys_ba r ()

Номери системних викликів

Кожному системному виклику операційної системи Linux присвоюєтьсяномер системного виклику (syscall number) Цей унікальний номер використовується для звернення до певного системному виклику Коли процес виконує системний виклик з простору користувача, процес не звертається до системного викликом по імені

Номер системного виклику є важливим атрибутом Одного разу призначений номер не повинен змінюватися ніколи, інакше це порушить роботу вже скомпільованих прикладних програм Якщо системний виклик видаляється, то відповідний номер не може використовуватися повторно В операційній системі Linux передбачений так званий нереалізований (Not implemented) системний виклик – функція sys_ni_syscal l (), яка не робить нічого, крім того, що повертає значення, рівне-ENOSYS, – код помилки, відповідний неправильного системному виклику Ця функція служить для затикання дірок у разі такого рідкісного подію, як видалення системного виклику

Ядро підтримує список зареєстрованих системних викликів в таблиці системних викликів Ця таблиця зберігається в памяті, на яку вказує змінна sys_call_table Дана таблиця залежить від апаратної платформи і зазвичай визначається у файлі entryS У таблиці системних викликів кожному унікальному номеру системного виклику призначається існуюча функція syscall

5 Може бути, цікаво, чому виклику в getpi d ()   повертає полеtgid,  яке є ідентифікатором м групи потоків (thread group ID) Це робиться тому, що дли звичайних процесів значення параметра TGID дорівнює значенню параметра PID  Пр і наявності декількох потоків значення параметра TGID  однаково дли всеки потоків однієї групи Така реалізація дає можливість різним потокам викликати функціюgetpid ()  і отримувати однакове значення параметраPID

Продуктивність системних викликів

Системні виклики в операційній системі Linux працюють швидше, ніж у багатьох інших операційних системах Це частково повязано з неймовірно малим часом перемикання контексту Перехід в режим ядра і вихід з нього є добре налагодженим процесом і простою справою Інший фактор – це простота як механізму обробки системних викликів, так і самих системних викликів

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*