Я пишу функцию C, которая будет вызываться из кода сборки.
(В частности, я хочу выполнить некоторую проверку задания на пути обработки системных вызовов в ядре Linux, поэтому я вызову функцию c до того, как системный вызов будет отправлен в entry_32.S)
Я смущаюсь с модификатором asmlinkage при определении моей функции c.
Я знаю, что asmlinkage должен сообщить компилятору, что параметры будут переданы через стек.
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
Вопросы:
(1) Требуется ли asmlinkage при определении такой функции, которая будет вызываться из кода сборки?
(2) что является стандартным вызовом в gcc. Если я опускаю "asmlinkage" при определении функции c, подразумевает ли это _cdecl или fastcall?
(3) если стандартным вызовом является cdecl, почему требуется asmlinkage, учитывая, что cdecl равен модификатору asmlinkage? (Я здесь прав?)
(4) почему эти функции системных вызовов объявлены с помощью asmlinkage. Можем ли мы сначала скопировать параметры в регистры, а затем вызвать эти функции системного вызова? С моей точки зрения, в x86 при выдаче системного вызова параметры легко сохраняются в регистрах; то зачем беспокоиться о том, чтобы сохранить в стеке, чтобы обеспечить такие параметры передачи с помощью соглашения об использовании стека?
Наконец, может ли кто-нибудь порекомендовать некоторые ресурсы/книги, на которые я могу ссылаться для такой сборки mix/c?