发新话题
打印

what is "asmlinkage"

what is "asmlinkage"

Hi guys

In main.c:

It is:
asmlinkage void __init start_kernel(void)

why not
void start_kernel(void)

why and how "asmlinkage" and "__init" come from??
how to define them????

      
haha...

TOP

给你的参考:
在Linux中所有系统调用服务例程都使用了asmlinkage标志。此标志是一个定义在/include/linux/linkage.h 中的一个宏:

#if defined __i386__ && (__GNUC__ > 2 || __GNUC_MINOR__ > 7)

#define asmlinkage CPP_ASMLINKAGE__attribute__((regparm(0)))

#else

#define asmlinkage CPP_ASMLINKAGE

#endif

其中涉及到了gcc的一些约定,总之,这个标志它可以告诉编译器该函数不需要从寄存器中获得任何参数,而是从堆栈中取得参数;即参数在堆栈中传递,而不是直接通过寄存器;

堆栈参数如下:

EBX = 0x00

ECX = 0x04

EDX = 0x08

ESI = 0x0C

EDI = 0x10

EBP = 0x14

EAX = 0x18

DS = 0x1C

ES = 0x20

ORIG_EAX = 0x24

EIP = 0x28

CS = 0x2C

EFLAGS = 0x30
  在进入系统调用总控程序前,用户按照以上的对应顺序将参数放到对应寄存器中,在系统调用总控程序一开始就将这些寄存器压入堆栈;在退出总控程序前又按如上顺序堆栈;用户程序则可以直接从寄存器中复得被服务程序加工过了的参数。而对于系统调用服务程序而言,参数就可以直接从总控程序压入的堆栈中复得;对参数的修改一可以直接在堆栈中进行;其实,这就是asmlinkage标志的作用。      

TOP

发新话题