2015-08-10 2 views
2

Я думал, что вызов функции с помощью модификатора asmlinkage должен вытолкнуть все аргументы в стек, пока я не сбился с толку из следующего в источнике ядра Linux (3.16).вызов конвенции относительно asmlinkage

источник в entry_64.S link

movq %rsp,%rdi 
call sync_regs 

Определение sync_regs в arch/x86/kernel/traps.c:

asmlinkage __visible notrace struct pt_regs *sync_regs(struct pt_regs *eregs) 
{ 
struct pt_regs *regs = task_pt_regs(current); 
*regs = *eregs; 
return regs; 
} 

Не следует ли ему необходимо нажать %rdi/%rsp в стек?

Ответ/вынос: Благодаря @Jester, ответ я описываю ниже:

  • ВНИМАНИЕ! На x86-64, все аргументы в регистрах, так это
  • имеет значение только на 32-битное ядро.»[linux src comment]
+2

В 64-битном соглашении о вызовах используются регистры для первых нескольких аргументов. Прочтите abi docs. – Jester

+0

Я думал, что для настройки по умолчанию (wo asmlinkage) ... так что для x_86_64, asmlikage НЕ будет принимать аргумент в стек? ... или asmlinkage только для 32 бит? – Richard

ответ

2

http://kernelnewbies.org/FAQ/asmlinkage говорит asmlinkage означает арг всегда помещаются в стек. Это, вероятно, старый док. 32bit i386 Linux использует регистр вызовов (regparm) внутри ядра, и asmlinkage на самом деле означает «следовать стандартной ABI, чем бы он». Так часто задаваемые вопросы относятся только к i386.

для x86-64 (и любая другая архитектура, которая не переопределяет его), asmlinkage определяется как пустой или extern "C" в коде C++. Для 32-битного x86 он определяется как regparm(0). (Спасибо, Шут, для копания в файлах заголовков.)

+1

Да, документ может быть неправильным. Но источник никогда не является :) Для x86-64 (и любой другой архитектуры, которая не переопределяет его), 'asmlinkage' определяется как пустой или' extern 'C "в коде C++. Для 32-битного x86 он определяется как 'regparm (0)'. – Jester

+0

Спасибо @Jester. Это подтверждает мое предположение, что i386 Linux строит с помощью 'regparm' для внутренних функций и использует только« стандартные »регистры на стеке ABI, когда это необходимо. –

+0

@Jester, не могли бы вы предоставить доказательства для вашего заявления: «Для x86-64 (и любой другой архитектуры, которая не переопределяет его), asmlinkage определяется как пустой» – Richard

Смежные вопросы