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