# 系统调用的说明以及调用方式 系统调用号存放在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;