系统调用与函数调用的区别以及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应该不一样。