Требуется ли asmlinkage для вызова функции c из ассемблера?

Я пишу функцию 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 при выдаче системного вызова параметры охотно сохраняются в регистрах; тогда зачем сохранять их в стеке, чтобы применять такие параметры передачи через соглашение о стеке?

Наконец, может ли кто-нибудь порекомендовать какие-нибудь ресурсы/книги, на которые я могу ссылаться, для такого комбинированного ассемблера/c-программирования?

17
задан Infinite 8 April 2012 в 14:40
поделиться