В Linux, по крайней мере, механизм системных вызовов работает в большинстве архитектур, помещая некоторые специально отформатированные данные (обычно это своего рода структура) в некоторые регистры или предопределенные адреса памяти.
Однако проблема заключается в том, чтобы заставить процессор переключаться в пространство ядра, чтобы он мог запустить привилегированный код ядра для обслуживания вызова. Это делается путем принудительной обработки какой-либо ошибки (ошибка деления на 0, неопределенного переполнения или ошибки сегмента и т. Д.), Что заставляет ядро взять на себя выполнение для обработки ошибки.
Обычно ядро обрабатывает ошибки, либо убивая вызывающий процесс, либо запуская пользовательский обработчик. Однако в случае системного вызова он вместо этого проверит предопределенные регистры и области памяти, и если они содержат запрос системного вызова, он выполнит это, используя данные, предоставленные пользовательским процессом в структуре в памяти. Обычно это нужно делать с какой-то специально созданной вручную сборкой, и чтобы упростить использование системного вызова для пользователя, системная библиотека C должна обернуть его как функцию. Для интерфейса более низкого уровня, пожалуйста, смотрите http://man7.org/linux/man-pages/man2/syscall.2.html для получения некоторой информации о том, как работают системные вызовы и как вы можете тогда вызывать без оболочки C.
Это слишком упрощено, это не так во всех архитектурах (в mips есть специальная инструкция syscall) и не обязательно работает одинаково на всех ОС. Тем не менее, если у вас есть какие-либо комментарии или вопросы, пожалуйста, задавайте.
Исправлено: Обратите внимание, что относительно вашего комментария о вещах в / dev / это на самом деле интерфейс более высокого уровня с ядром, а не нижний. Эти устройства фактически используют около 4 системных вызовов. Запись для них аналогична системному вызову записи, чтению системного вызова чтения, открытию / закрытию их, эквивалентным системным вызовам open и close, и запуску ioctl вызывает специальный системный вызов ioctl, который сам по себе является интерфейсом для доступа к одному из многих системных ioctl. вызовы (специальные, обычно вызовы, специфичные для устройства, с слишком узким использованием, чтобы написать для них целый системный вызов).