В обчислювальній техніці а системний виклик це програмний спосіб, за допомогою якого комп’ютерна програма запитує службу в ядра операційної системи, у якій вона виконується. Системний виклик — це спосіб для програм взаємодіяти з операційною системою . Комп’ютерна програма здійснює системний виклик, коли надсилає запит до ядра операційної системи. Системний виклик забезпечує послуги операційної системи для програм користувача через інтерфейс прикладних програм (API). Він забезпечує інтерфейс між процесом і операційною системою, щоб дозволити процесам рівня користувача запитувати служби операційної системи. Системні виклики є єдиними точками входу в ядро система. Усі програми, яким потрібні ресурси, повинні використовувати системні виклики.
Програма користувача може взаємодіяти з операційною системою за допомогою системного виклику. Програма запитує ряд послуг, і ОС відповідає, запускаючи ряд системних викликів для виконання запиту. Системний виклик можна записати на мовах високого рівня, наприклад C або Pascal, або на мові асемблера. Якщо використовується мова високого рівня, операційна система може безпосередньо викликати системні виклики, які є попередньо визначеними функціями.
Системний виклик — це механізм, який використовується програмами для запиту послуг у операційна система (ОС). Простіше кажучи, це спосіб взаємодії програми з основною системою, наприклад, доступ до апаратних ресурсів або виконання привілейованих операцій.
Системний виклик ініціюється програмою, яка виконує певну інструкцію, яка запускає перемикання на ядро режим, що дозволяє програмі запитувати послугу від ОС. Потім ОС обробляє запит, виконує необхідні операції та повертає результат програмі.
Системні виклики необхідні для належного функціонування операційної системи, оскільки вони надають програмам стандартизований спосіб доступу до системних ресурсів. Без системних викликів кожній програмі потрібно було б реалізувати власні методи доступу до обладнання та системних служб, що призводило б до непослідовної та схильної до помилок поведінки.
Послуги, що надаються системними викликами
- Створення та управління процесом
- Керування основною пам'яттю
- Доступ до файлів, каталог і керування файловою системою
- Обробка пристроїв (I/O)
- захист
- Мережа тощо
- Контроль процесу: завершувати, переривати, створювати, завершувати, виділяти та звільняти пам’ять.
- Керування файлами: створювати, відкривати, закривати, видаляти, читати файли тощо.
- Управління пристроєм
- Інформаційне обслуговування
- спілкування
Особливості системних викликів
- Інтерфейс: Системні виклики забезпечують чітко визначений інтерфейс між програмами користувача та операційною системою. Програми надсилають запити, викликаючи певні функції, а операційна система у відповідь виконує запитану послугу та повертає результат.
- захист: Системні виклики використовуються для доступу до привілейованих операцій, які недоступні для звичайних програм користувача. Операційна система використовує цей привілей для захисту системи від зловмисного або несанкціонованого доступу.
- Режим ядра: Коли здійснюється системний виклик, програма тимчасово перемикається з режиму користувача в режим ядра. У режимі ядра програма має доступ до всіх системних ресурсів, включаючи обладнання, пам'ять та інші процеси.
- Перемикання контексту: Системний виклик потребує перемикання контексту, яке передбачає збереження стану поточного процесу та перемикання в режим ядра для виконання запитуваної служби. Це може призвести до накладних витрат, які можуть вплинути на продуктивність системи.
- Обробка помилок: Системні виклики можуть повертати коди помилок, які вказують на проблеми із запитаною службою. Програми повинні перевіряти ці помилки та відповідним чином їх обробляти.
- Синхронізація: Системні виклики можна використовувати для синхронізації доступу до спільних ресурсів, таких як файли або мережеві підключення. Операційна система забезпечує механізми синхронізації, такі як блокування або семафори, щоб забезпечити безпечний доступ кількох програм до цих ресурсів.
Переваги системних дзвінків
- Доступ до апаратних ресурсів: Системні виклики дозволяють програмам отримувати доступ до апаратних ресурсів, таких як диски, принтери та мережеві пристрої.
- Керування пам'яттю: Системні виклики надають програмам спосіб виділяти та звільняти пам’ять, а також отримувати доступ до апаратних пристроїв, відображених у пам’яті.
- Управління процесом: Системні виклики дозволяють програмам створювати та завершувати процеси, а також керувати міжпроцесним зв’язком.
- Безпека: Системні виклики надають програмам спосіб доступу до привілейованих ресурсів, наприклад можливість змінювати параметри системи або виконувати операції, для яких потрібні адміністративні дозволи.
- Стандартизація: Системні виклики забезпечують стандартизований інтерфейс для взаємодії програм з операційною системою, забезпечуючи послідовність і сумісність між різними апаратними платформами та версіями операційної системи.
Як працює системний виклик?
Ось детальне пояснення крок за кроком, як працює системний виклик:
- Користувачеві потрібні спеціальні ресурси: Іноді програмам потрібно виконувати певні дії, які неможливо виконати без дозволу ОС, як-от читання з файлу, запис у файл, отримання будь-якої інформації з апаратного забезпечення або запит на місце в пам’яті.
- Програма робить запит на системний виклик: Існують спеціальні попередньо визначені інструкції для здійснення запиту до операційної системи. Ці інструкції є нічим іншим, як системним викликом. Програма використовує ці системні виклики у своєму коді, коли це необхідно.
- Операційна система бачить системний виклик: Коли ОС бачить системний виклик, вона визнає, що програмі зараз потрібна допомога, тому вона тимчасово зупиняє виконання програми та передає весь контроль спеціальній частині себе під назвою «Ядро». Тепер «Ядро» вирішує потребу програми.
- Операційна система виконує такі операції: Тепер операційна система виконує операцію, яку вимагає програма. Приклад: читання вмісту з файлу тощо.
- Операційна система повертає керування програмі: Після виконання спеціальної операції ОС повертає керування програмі для подальшого виконання програми.
Приклади системного виклику в Windows і Unix
Системні виклики для Windows і Unix мають багато різних форм. Вони перераховані в таблиці нижче:
процес | вікна | Unix |
---|---|---|
Контроль процесів | CreateProcess() ExitProcess() WaitForSingleObject() | Вилка() Вихід() upcasting Зачекайте() |
Маніпуляції з файлами | CreateFile() ReadFile() WriteFile() | ВІДЧИНЕНО() Читати() Написати() Закрити() |
Управління пристроєм | SetConsoleMode() ReadConsole() WriteConsole() | Ioctl() Читати() Написати() |
Ведення інформації | GetCurrentProcessID() SetTimer() сон() | Getpid() будильник() сон() |
спілкування | CreatePipe() CreateFileMapping() MapViewOfFile() | Труба() Shmget() Mmap() |
захист | SetFileSecurity() InitializeSecurityDescriptor() SetSecurityDescriptorgroup() | Chmod() bash прочитати файл розкрити() Чоун() |
ВІДЧИНЕНО(): Доступ до файлу у файловій системі можливий за допомогою системного виклику open(). Він надає необхідні файлові ресурси та дескриптор, який може використовувати процес. Файл може бути відкритий декількома процесами одночасно або лише одним процесом. Все базується на структурі та файловій системі.
читати(): Дані з файлу у файловій системі витягуються за допомогою нього. Загалом, він приймає три аргументи:
- Опис файлу.
- Буфер для зберігання зчитаних даних.
- Скільки байт потрібно прочитати з файлу
Перед читанням файл, який потрібно прочитати, можна ідентифікувати за його файловим дескриптором і відкрити за допомогою функції open().
чекай(): У деяких системах може знадобитися затримати процес, доки не завершиться виконання іншого процесу, перш ніж продовжити. Коли батьківський процес створює дочірній процес, виконання батьківського процесу припиняється до завершення дочірнього процесу. Батьківський процес зупиняється за допомогою системного виклику wait(). Батьківський процес відновлює контроль після завершення виконання дочірнього процесу.
написати(): Дані з буфера користувача записуються з його допомогою на пристрій, як у файл. Використовуючи це, програма може створювати дані одним способом системний виклик . загалом є три аргументи:
- Опис файлу.
- Посилання на буфер, де зберігаються дані.
- Обсяг даних, які будуть записані з буфера в байтах.
fork(): Системний виклик fork() використовується процесами для створення своїх копій. Це один із методів, який найчастіше використовується в операційних системах для створення процесів. Коли батьківський процес створює дочірній процес, виконання батьківського процесу призупиняється до завершення дочірнього процесу. Батьківський процес відновлює контроль після завершення виконання дочірнього процесу.
вихід(): Системний виклик під назвою exit() використовується для завершення програми. У середовищах із кількома потоками цей виклик вказує, що виконання потоку завершено. Після використання системної функції exit() операційна система відновлює ресурси, використані процесом.
Методи передачі параметрів в ОС
Якщо відбувається системний виклик, ми повинні передати параметр до ядра операційної системи.
що робить комп'ютер швидким
Для прикладу подивіться на дане ВІДЧИНЕНО() системний виклик:
C
//function call example> #include> int> open(> const> char> *pathname,> int> flags, mode_t mode);> |
>
>
тут шлях , прапори і mode_t це параметри.
Отже, слід зазначити, що:
- Ми не можемо передати параметри безпосередньо, як у звичайному виклику функції.
- У режимі Kernal існує інший спосіб виконання виклику функції.
Отже, ми не можемо запустити його у звичайному адресному просторі, який уже створив процес, і, отже, ми не можемо розмістити параметри у верхній частині стека, оскільки вони недоступні для обробки ядру операційної системи. тому ми повинні застосувати будь-які інші методи для передачі параметрів до ядра ОС.
Актриса Сай Паллаві
Ми можемо це зробити,
- Передача параметрів у регістри
- Адреса блоку передається як параметр у регістрі.
- Параметри поміщаються в стек.
Розглянемо кожен пункт докладніше:
1. Передача параметрів у регістри.
- Це найпростіший спосіб з трьох
- Тут ми безпосередньо передаємо параметри в регістри.
- Але це буде обмежено, коли кількість параметрів перевищує кількість регістрів.
- Ось програмний код C:
C
// Passing parameters in registers.> #include> #include> int> main()> {> > const> char> * pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> fd = open(pathname, flags, mode);> > // in function call open(), we passed the parameters pathanme,flags,mode to the kernal directly> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
2. Адреса блоку передається як параметр
- Його можна застосовувати, коли кількість параметрів перевищує кількість регістрів.
- Параметри зберігаються в блоках або таблиці.
- Адреса блоку передається в регістр як параметр.
- Найчастіше використовується в Linux і Solaris.
- Ось програмний код C:
C
//Address of the block is passed as parameters> #include> #include> int> main() {> > const> char> *pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> params[3];> > // Block of data(parameters) in array> > params[0] = (> int> )pathname;> > params[1] = flags;> > params[2] = mode;> > int> fd = syscall(SYS_open, params);> > // system call> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
3. Параметри поміщаються в стек
- У цьому методі параметри можна вставити за допомогою програми та відкрити за допомогою операційної системи
- Тож Kernal може легко отримати доступ до даних, отримуючи інформацію з верхньої частини стеку.
- Ось програмний код C
C
//parameters are pushed into the stack> #include> #include> #include> int> main() {> > const> char> *pathname => 'example.txt'> ;> > int> flags = O_RDONLY;> > mode_t mode = 0644;> > int> fd;> > asm> volatile> (> > 'mov %1, %%rdi
'> > 'mov %2, %%rsi
'> > 'mov %3, %%rdx
'> > 'mov , %%rax
'> > 'syscall'> > :> '=a'> (fd)> > :> 'r'> (pathname),> 'r'> (flags),> 'r'> (mode)> > :> '%rdi'> ,> '%rsi'> ,> '%rdx'> > );> > if> (fd == -1) {> > perror> (> 'Error opening file'> );> > return> 1;> > }> > // File operations here...> > close(fd);> > return> 0;> }> |
>
>
методи списку java
Питання, що часто задають
Q.1: Як працює системний виклик?
відповідь:
Коли програма виконує системний виклик, вона переходить із режиму користувача в режим ядра, який є більш привілейованим режимом. Перехід зазвичай ініціюється викликом певної функції або перериванням інструкції, наданої мовою програмування або операційною системою.
У режимі ядра системний виклик обробляється операційною системою. Ядро виконує запитану операцію від імені програми та повертає результат. Після цього управління повертається до програми рівня користувача, яка продовжує своє виконання.
Q.2: Чому потрібні системні виклики?
відповідь:
Системні виклики необхідні з кількох причин:
Доступ до привілейованих операцій: Багато операцій, як-от керування апаратними пристроями або зміна конфігурацій системи, вимагають вищих привілеїв, які доступні лише через системні виклики.
Управління ресурсами: Системні виклики надають стандартизований інтерфейс для розподілу та керування системними ресурсами, такими як пам’ять, файли та пристрої, забезпечуючи справедливий і контрольований доступ різними процесами.
Абстракція: Системні виклики абстрагують основні складності операційної системи, дозволяючи розробникам програм взаємодіяти з системою на вищому рівні, незалежно від платформи.
Безпека та захист: Системні виклики забезпечують контроль доступу та політики безпеки, запобігаючи несанкціонованому доступу до конфіденційних ресурсів і захищаючи цілісність системи.