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