mov [register]
и подобные им являются не системными вызовами, а инструкциями ассемблера.
Системные вызовы в основном представляют собой пользовательскую -космическую программу, вызывающую определенные подпрограммы -в ядре, используя механизм, встроенный в процессор и установленный ядром, который позволяет вызываемой подпрограмме -иметь более высокий уровень привилегий, чем код космической программы обычного пользователя -.
Инструкции на ассемблере в основном представляют собой удобное для человека -представление фактических байтов машинного кода. А машинный код не интерпретируется и не компилируется, а реализуется внутри процессора либо микрокодом процессора, либо напрямую на аппаратном уровне, с помощью больших групп логических вентилей.
Один вызов системного вызова на языке ассемблера обычно состоит из нескольких строк кода. Сначала параметры для системного вызова загружаются в соответствующие регистры процессора и/или в стек, а затем используется специальная инструкция, такая как int 0x80
или syscall
, для фактического выполнения системного вызова.
В 32-битной архитектуре x86 -int 0x80
используется в качестве инструкции системного вызова. Ядро подготовило таблицу программных обработчиков прерываний для процессора. Эта таблица недоступна напрямую для обычного пользователя -, но с помощью инструкции int
код пользовательского пространства может вызвать одну из подпрограмм, на которые указывает таблица. int 0x80
просто говорит процессору переключиться в режим ядра и перейти к подпрограмме, адрес которой находится в слоте #128 этой таблицы. Эта подпрограмма является интерфейсом системных вызовов Linux для 32 -битной архитектуры x86 :. Она проверяет заданные параметры, определяет, какой процесс выполнил вызов, а затем переходит к соответствующей подпрограмме -.
В 64-битной -версии архитектуры x86 для той же цели существует специальная инструкция syscall
. На самом деле, 32 -битная архитектура x86 теперь тоже имеет его, но либо его еще не существовало, когда Линус Торвальдс разработал 32 -битное соглашение о системных вызовах Linux, либо в инструкции была аппаратная ошибка в некоторых моделях процессоров, так и не привык. Но так как все 64 -битные процессоры x86 имеют инструкцию syscall
и она определенно работает, она используется.