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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

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

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

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

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

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

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

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

Багато операційних система мають сотні викликів. Наприклад, Linux має більш ніж 300, FreeBSD більше 500[1].

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

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

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

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

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

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

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

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

References[ред.ред. код]

  1. «FreeBSD syscalls.c, the list of syscall names and IDs». Архів оригіналу за 2013-07-27. 
  2. Anonymous (2002-12-19). «Linux 2.5 gets vsyscalls, sysenter support». KernelTrap. Архів оригіналу за 2012-07-15. Процитовано 2008-01-01. 
  3. Bach, Maurice J. (1986), The Design of the UNIX Operating System, Prentice Hall, pp. 15-16.
  4. «Discussion of syscall implementation at ProgClub including quote from Bach 1986». Архів оригіналу за 2013-09-01. 

External links[ред.ред. код]