Что такое системный вызов?
Часть раздела Основы путешествия по Assembly на Coddy — урок 31 из 45.
Вы писали инструкции ассемблера, такие как mov и lea. Эти инструкции выполняются непосредственно на процессоре. Но что, если вам нужно сделать что-то, что процессор не может сделать сам по себе — например, вывести текст на экран, прочитать данные с клавиатуры или завершить программу?
Для этих задач вам понадобится операционная система (Linux в этом курсе).
Что такое syscall?
Syscall (системный вызов) — это запрос вашей программы к операционной системе. Это способ, с помощью которого вы просите ОС выполнить какое-либо действие для вас.
Зачем нужны системные вызовы (syscalls):
| Задача | Может ли процессор сделать это сам? | Нужен системный вызов (syscall)? |
|---|---|---|
| Сложить два числа | Да | Нет |
| Переместить данные между регистрами | Да | Нет |
| Вывести текст на экран | Нет | Да |
| Прочитать ввод с клавиатуры | Нет | Да |
| Завершить программу | Нет | Да |
| Открыть файл | Нет | Да |
Как работает системный вызов:
- Вы помещаете номер системного вызова в
rax(сообщает ОС, что вы хотите сделать) - Вы помещаете аргументы в другие регистры (
rdi,rsi,rdxи т. д.) - Вы выполняете инструкцию
syscall
- Процессор переходит в ядро ОС
- ОС выполняет запрос
- ОС возвращает управление вашей программе
Аналогия:
Представьте системный вызов (syscall) как обращение в государственное учреждение:
| Шаг | Аналогия | В ассемблере |
|---|---|---|
| 1 | Решите, какая услуга вам нужна | Выберите номер системного вызова (поместите в rax) |
| 2 | Заполните формы | Поместите аргументы в регистры |
| 3 | Отправьте запрос | Выполните syscall |
| 4 | Государство обрабатывает его | Ядро ОС выполняет работу |
| 5 | Получите результат | Программа продолжается |
Системные вызовы, которые вы изучите в этом курсе:
| Системный вызов | Номер | Что он делает | Глава |
|---|---|---|---|
exit | 60 | Завершает программу | Глава 4 |
write | 1 | Выводит текст на экран | Глава 5 |
Самый важный системный вызов на данный момент: <strong>exit</strong>
Без exit ваша программа будет работать вечно или завершится с ошибкой. Каждая программа, которую вы пишете, должна заканчиваться системным вызовом exit.
mov rax, 60 ; номер системного вызова для выхода
mov rdi, 0 ; код выхода (0 = успех)
syscall ; запрос к ОС на выходПопробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-642Системы счисления
Почему двоичная система?Двоичные числаИз десятичной в двоичнуюПочему шестнадцатеричная система?Из шестнадцатеричной в десятичнуюИз десятичной в шестнадцатеричнуюASCII и Hex5Системный вызов Exit
Что такое системный вызов?Системный вызов Exit (60)Коды завершенияИтоги: корректное завершение