Системний виклик — Вікіпедія

Системний виклик (англ. system call) — в інформатиці це спосіб використання застосунками сервісів ядра операційної системи. Це можуть бути сервіси, пов'язані з апаратною складовою комп'ютера (наприклад, доступ до диска), керування процесами та потоками, та багато іншого. Системні виклики забезпечують інтерфейс між процесом та операційною системою.

Привілеї[ред. | ред. код]

Архітектура практично всіх сучасних мікропроцесорів (окрім деяких вбудованих систем) реалізує модель безпеки, за якою існує багато рівнів прав, які можуть надаватися програмному забезпеченню. Наприклад, програма зазвичай виконується у власному адресному просторі та не має доступу до пам'яті інших програм та операційної системи; програма зазвичай не має привілеїв на прямий доступ до обладнання. Операційна система виконується на вищому рівні привілеїв, та має прямий доступ до комп'ютера.

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

Бібліотека як посередник[ред. | ред. код]

З операційними системами створюють бібліотеки чи API, які є посередниками між звичайними програмами та системою. Часто це реалізації стандартної бібліотеки мови C (libc), наприклад glibc, які надають обгортки для системних викликів.

Приклади[ред. | ред. код]

В Unix та інших POSIX-сумісних операційних системах популярними системними викликами є open, read, write, close, wait, exec, fork, exit, та kill.

Багато операційних систем мають сотні викликів. Наприклад, Linux має більш ніж 300, FreeBSD більше 500[1]. Мікроядро Neutrino операційної системи QNX (версії 6.3) має 63 системних виклики.[2]

Відслідковувати використання програмами сервісів операційної системи можна за допомогою програм strace та truss. Вони дозволяють запустити процес та повідомляти про всі виклики, що він робить, або приєднатися до процесу, що вже існує, та перехоплювати його системні виклики. Ці можливості також реалізовані за допомогою системних викликів.

Реалізація[ред. | ред. код]

Реалізація системних викликів потребує команд переходу від одного коду до іншого, а це операції, що залежні від архітектури. Тривіальний спосіб реалізації — це використання програмного переривання. Переривання передає керування операційній системі, тому номер потрібного системного виклику потрібно лише записати у певний регістр процесора та виконати команду переривання.

Багато RISC-процесорів пропонують лише такий спосіб, в той час як процесори архітектури CISC (такі як x86) підтримують додаткові технології. Наприклад, SYSCALL/SYSENTER, SYSRET/SYSEXIT (два механізми, що були розроблені незалежно один від одного компаніями AMD та Intel). Це інструкції «швидкого» перемикання контексту, які спроектовані для реалізації системних викликів, що не потребують переривань. В ядрі Linux з версії 2.5 вже використовуються ці функції. Раніше використовувалася інструкція INT (0x80), а номер виклику записувався в регістр EAX.[3]

Старий x86-механізм, що називався шлюзом виклику (англ. call gate), пропонував програмам безпосередньо викликати функції ядра, використовуючи безпечні механізми перемикання контексту, які забезпечувала операційна система. Цей підхід не став популярним, мабуть через те, що він потребував «дальні виклики» та погано впливав на переносність програмного забезпечення.

Для архітектури IA-64 використовується інструкція EPC (англ. Enter Privileged Mode). Для перших восьми викликів використовують регістри, а для інших — стек.

Перемикання контекстів[ред. | ред. код]

Системні виклики виконуються у режимі ядра, який перемикає процесор до більш привілейованого рівня, але не обов'язково змінює контекст процесу. Апаратні засоби бачать світ в термінах режиму виконання, що визначаються статусом процесора, а процес — це лише абстракція рівня операційної системи. Тому системний виклик не завжди потребує перемикання контексту на інший процес, а виконується в контексті процесу, який зробив виклик.[4][5]

Примітки[ред. | ред. код]

  1. FreeBSD syscalls.c, the list of syscall names and IDs. Архів оригіналу за 27 липня 2013. Процитовано 18 березня 2012.
  2. QNX 6.3 microkernel source code.
  3. Anonymous (19 грудня 2002). Linux 2.5 gets vsyscalls, sysenter support. KernelTrap. Архів оригіналу за 15 липня 2012. Процитовано 1 січня 2008.
  4. Bach, Maurice J. (1986). The Design of the UNIX Operating System (англ.). Prentice Hall. с. 15—16.
  5. Discussion of syscall implementation at ProgClub including quote from Bach 1986. Архів оригіналу за 1 вересня 2013. Процитовано 18 березня 2012.

Посилання[ред. | ред. код]