以glibc-2.9, Linux i386为例,在sysdeps/unix/sysv/linux/i386/syscall.S中可以看到
123456789
ENTRY(syscall)PUSHARGS_6/* Save register contents. */_DOARGS_6(44)/* Load arguments. */movl20(%esp),%eax/* Load syscall number into %eax. */ENTER_KERNEL/* Do the system call. */POPARGS_6/* Restore register contents. */cmpl$-4095,%eax/* Check %eax for error. */jaeSYSCALL_ERROR_LABEL/* Jump to error handler if error. */
/* The original calling convention for system calls on Linux/i386 is to use int $0x80. */#ifdef I386_USE_SYSENTER# ifdef SHARED# define ENTER_KERNEL call *%gs:SYSINFO_OFFSET# else# define ENTER_KERNEL call *_dl_sysinfo# endif#else# define ENTER_KERNEL int $0x80#endif
而I386_USE_SYSENTER这个宏也是在同一个头文件中定义的
123456
#if defined USE_DL_SYSINFO \ && (!defined NOT_IN_libc || defined IS_IN_libpthread)# define I386_USE_SYSENTER 1#else# undef I386_USE_SYSENTER#endif