Я пишу функцию C, которая будет вызываться из кода сборки.Является ли «asmlinkage» обязательным для функции c, вызываемой из сборки?
(В частности, я хочу сделать некоторые проверки работы в пути обработки в Linux ядро системного вызова, поэтому я буду называть функции с до того, как системный вызов отправляется в entry_32.S)
Я смущен с модификатором asmlinkage при определении моей функции c.
Я знаю, что asmlinkage должен сообщить компилятору, что параметры будут переданы через стек.
#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))
Вопросы:
(1) Требуется ли asmlinkage при определении такой функции, которая будет вызываться из ассемблера?
(2) Что такое соглашение о вызове по умолчанию в gcc. Если я опускаю «asmlinkage» при определении функции c, подразумевает ли она _cdecl или fastcall?
(3) Если стандартное соглашение о вызове - cdecl, зачем нужна такая комбинация, учитывая, что cdecl равен модификатору asmlinkage? (я исправлю здесь?)
(4) почему эти функции системного вызова все объявлены с помощью asmlinkage. Можем ли мы сначала скопировать параметры в регистры, а затем вызвать эти функции системного вызова? С моей точки зрения, в x86 при выдаче системного вызова параметры легко сохраняются в регистрах; то зачем беспокоиться о том, чтобы сохранить в стеке, чтобы обеспечить такие параметры передачи через соглашение стека?
И, наконец, может ли кто-нибудь рекомендовать некоторые ресурсы/книги, на которые я могу ссылаться для такой сборки сборки/программирования c?
В 32-разрядной версии x86 соглашение о вызове, используемое в ядре, похоже, не является точно GNU fastcall (т. Е. Первые 2 аргумента - в '% ecx' и'% edx'). Он управляется параметром '-mregparm = 3' [GCC] (http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html), который инструктирует компилятор использовать'% eax', '% edx','% ecx' для первых 3 аргументов в этом порядке. Это похоже на соглашение с Borland fastcall, но все же. – Eugene