
调用有下面三种方式:
在x86与x86_64的系统中,都可以使用int $0x80指令来执行系统调用,参数使用如下:
x86_64引入了一个新指令syscall来执行系统调用,参数使用如下:
正常调用库函数( man 3 execve ),传参方式见 x86 调用约定
查看调用号:头文件 /usr/include/asm/unistd.h 内容如下,所以32位和64位的调用号可以分别在unistd_32.h和unistd_64.h中找到
查看参数: man 2 execve
以 execve 为例, man 2 execve 查看其接口如下: int execve(const char *pathname, char *const argv[], char *const envp[])
下面汇编实现了 execve("/bin/sh", 0, 0) :
32位:
64位:
系统调用时由 *** 作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。
*** 作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。
系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。
扩展资料对于一般通用的OS而言,系统调用分为三大类: 1、进程
控制类系统调用
主要用于对进程控制的系统调用有:
(1)创建和终止进程的系统调用。
(2)获得和设置进程属性的系统调用。进程的属性包括有进程标识符,进程优先级,最大允许执行时间等。
(3)等待某事件出现的系统调用。
2、文件 *** 纵类系统调用
(1)创建和删除文件
(2)打开和关闭文件的系统调用
(3)读和写文件的系统调用
3、进程通信类系统调用
在单机处理系统中,OS经常采用消息传递方式和共享存储区方式。
当采用消息传递方式时,通信前需先打开一个连接。为此,应由源进程发出一条打开连接的系统调用,而目标进程则应利用接受连接的系统调用表示同意进行通信;
然后,在源和目标进程之间便开始通信。可以利用发送消息的系统调用或者用接收消息的系统调用来交换信息。通信结束后,还须再利用关闭连接的系统调用结束通信。
用户在利用共享存储区进行通信之前,须先利用建立共享存储区的系统调用来建立一个共享存储区,再利用建立连接的系统调用将该共享存储区连接到进程自身的虚地址空间上,然后便可以利用读和写共享存储区的系统调用实现相互通信。
参考资料来源:百度百科-系统调用


评论列表(0条)