Выполнение «системного вызова» означает запуск ядра для выполнения специальной операции.Поскольку ядро работает в другом адресном пространстве, это нельзя сделать простым вызовом функции.
В зависимости от операционной системы и аппаратной платформы системный вызов может быть вызван, например, путем запуска прерывания,call gate, SYSENTER или несколько других методов.
В любом случае, однако, вы не можете просто передать ядру ряд параметров так, как вы бы поступили с вызовом функции C.Вы можете , однако, поместите значения параметров в определенные регистры.То, какие это регистры, и как их содержимое интерпретируется ядром, опять-таки зависит от рассматриваемой ОС.
Поскольку вы не можете ни получить доступ к конкретным регистрам, ни вызвать какой-либо из методов запуска ядра, упомянутых выше,в простом C-коде вам доступны оболочки syscall , которые называются подобными функциям C, а затем помещают параметры в регистры и запускают ядро с помощью кода ASM.
То, что вы видите выше, является такой оболочкой системного вызова.Вы видите часть, где он помещает количество аргументов в регистр r7, сами аргументы в соответствующие регистры (LOADREGS_*
), затем выполняет триггер (swi 0x0
, который, как я думаю , является программным прерыванием).- Я не очень разбираюсь в платформе ARM) и получаю «возвращаемое значение» из регистра A1.