|
|
# 系统调用的说明以及调用方式
|
|
|
系统调用号存放在eax寄存器中, 参数一般不超过3个,分别储存在ebx、ecx、edx寄存器中。
|
|
|
返回值保存在eax中。
|
|
|
|
|
|
主要参考了Linux 5.10 syscalls,详细请参见:https://man7.org/linux/man-pages/man2/syscalls.2.html ;也可以在实验用的Ubuntu虚拟机中用man命令查看,如man getdents。
|
|
|
|
|
|
## 系统调用execve2
|
|
|
```
|
|
|
#define __NR_execve2 87
|
|
|
int execve2(const char *path, char * argv[], char * envp[]);
|
|
|
```
|
|
|
* 功能:以立即加载方式执行一个指定的程序。此系统调用结束后,进程运行时不应再发生代码段和数据段中的缺页故障。
|
|
|
* 输入:
|
|
|
- path: 待执行程序路径名称,
|
|
|
- argv: 程序的参数,
|
|
|
- envp: 环境变量的数组指针
|
|
|
* 返回值:成功不返回,失败返回-1;
|
|
|
|
|
|
## 系统调用getdents
|
|
|
```
|
|
|
#define __NR_getdents 88
|
|
|
int getdents(unsigned int fd, struct linux_dirent *dirp, unsigned int count);
|
|
|
```
|
|
|
* 功能:获取目录的目录项。
|
|
|
* 输入:
|
|
|
- fd:所要读取目录的文件描述符。
|
|
|
- dirp:一个缓存区,用于保存所读取目录的信息。缓存区的结构如下:
|
|
|
```
|
|
|
struct linux_dirent {
|
|
|
long d_ino;
|
|
|
off_t d_off;
|
|
|
unsigned short d_reclen;
|
|
|
char d_name[14];
|
|
|
};
|
|
|
```
|
|
|
- count:dirp的大小。
|
|
|
* 返回值:成功执行,返回读取的字节数。当到目录结尾,则返回0。失败,则返回-1。
|
|
|
* current->filp[fd]->f_inode
|
|
|
* 目录文件描述符表
|
|
|
|
|
|
## 系统调用pipe2
|
|
|
```
|
|
|
#define __NR_pipe2 89
|
|
|
int pipe2(int fd[2], int flags);
|
|
|
```
|
|
|
* 功能:创建管道;
|
|
|
* 输入:
|
|
|
- fd[2]: 用于保存2个文件描述符。其中,fd[0]为管道的读出端,fd[1]为管道的写入端。
|
|
|
- flags: 标志;如果为0,则pipe2的行为与系统调用pipe相同。
|
|
|
* 返回值:成功执行,返回0。失败,返回-1。
|
|
|
|
|
|
## 系统调用sleep
|
|
|
```
|
|
|
#define __NR_sleep 90
|
|
|
int sleep(unsigned int seconds);
|
|
|
```
|
|
|
* 功能:执行进程睡眠;
|
|
|
* 输入:睡眠的时间间隔;
|
|
|
- seconds: 秒
|
|
|
* 返回值:成功返回0,失败返回-1;
|
|
|
|
|
|
## 系统调用getcwd
|
|
|
```
|
|
|
#define __NR_getcwd 91
|
|
|
long getcwd(char * buf, size_t size);
|
|
|
```
|
|
|
* 功能:获取当前工作目录;
|
|
|
* 输入:
|
|
|
- char *buf:一块缓存区,用于保存当前工作目录的字符串。当buf设为NULL,由系统来分配缓存区。
|
|
|
- size:buf缓存区的大小。
|
|
|
* 返回值:成功执行,则返回当前工作目录的字符串的指针。失败,则返回NULL。
|
|
|
|
|
|
## 系统调用mmap
|
|
|
```
|
|
|
#define __NR_mmap 92
|
|
|
long mmap(void *start, size_t len, int prot, int flags,
|
|
|
int fd, off_t off);
|
|
|
```
|
|
|
* 功能:将文件或设备映射到内存中;
|
|
|
* 输入:
|
|
|
- start: 映射起始位置
|
|
|
- len: 长度
|
|
|
- prot: 映射的内存保护方式,可取:PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE
|
|
|
- flags: 映射是否与其他进程共享的标志,可取:MAP_FILE, MAP_SHARED, MAP_PRIVATE
|
|
|
- fd: 文件句柄
|
|
|
- off: 文件偏移量
|
|
|
* 返回值:成功返回已映射区域的指针,失败返回-1;
|
|
|
|
|
|
## 系统调用munmap
|
|
|
```
|
|
|
#define __NR_munmap 93
|
|
|
int munmap(void * start, size_t len);
|
|
|
```
|
|
|
* 功能:将文件或设备取消映射到内存中;
|
|
|
* 输入:
|
|
|
- start: 映射的指定地址
|
|
|
- len: 区间长度
|
|
|
* 返回值:成功返回0,失败返回-1;
|
|
|
|
|
|
## 系统调用clone
|
|
|
```
|
|
|
#define __NR_clone 94
|
|
|
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
|
|
|
```
|
|
|
* 功能:创建一个子进程;
|
|
|
* 输入:
|
|
|
- fn: 子进程的主函数
|
|
|
- child_stack: 指定新进程的栈,可为0。
|
|
|
- flags: 创建的标志,如SIGCHLD、CLONE_VM,其中CLONE_VM表示子进程共享父进程的地址空间(除栈以外)。
|
|
|
- arg: 主函数的参数
|
|
|
* 返回值:成功则返回子进程的线程ID,失败返回-1;
|