系统调用与函数调用在32位和64位的区别

系统调用与函数调用的区别以及32位机与64位机在这两方面的区别

1系统调用与函数调用的区别

  操作系统实现提供的所有系统调用所构成的集合即程序接口(用户可以直接使用的接口)或应用编程接口(Application Programming Interface,API)用户通过程序间接使用的接口)。是应用程序同系统之间的接口。
 函数调用是调用函数库中的一个程序,而系统调用是调用系统内核的服务。函数调用是在用户地址空间执行,而系统调用是在内核地址空间执行。
函数调用的运行时间属于“用户”时间,而系统调用的运行时间属于“系统”时间。
  总而言之,二者并不一样。

2.系统调用的区别

  32位系统调用使用 “ int 80h “,64位系统调用使用 “ syscall “ (汇编代码就是syscall,可由ROPgadget查找)。32的系统调用号与64位的也不大一样。比如32位是:

1
#define __NR_execve 11

64位是:

1
#define __NR_execve 59

32位的系统调用号放在eax ,传参依次是 EBX、ECX、EDX、ESI、EDI、EBP。
64位的系统调用号放在rax ,传参依次是 RDI、RSI、RDX、R10、R8、R9 。

3.函数调用的区别

  64位程序和32位的区别之一还在在于函数参数的传递。32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用 rdi,rsi,rdx,rcx,r8,r9作为第1-6个参数。rax作为返回值 ,64位没有栈帧的指针,32位用ebp作为栈帧指针,64位取消了这个设定,rbp作为通用寄存器使用。
  注:rcx与r10应该不一样。