系统调用是用户程序和linux内核交互的接口,linux的系统
调用有下面三种方式:
在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位:
标准的c函数库是所有的编译都要具有的函数库,(实际上还是略有不同),但是这些基本上实现方法略有不同,但是结果和标准是一样的。但是linux的系统调用,调用是linux的系统库,比如说unistd.h下的fork这个是Linux下特有,你在vs上,就没有这个库,也没有这个函数。同样在vs上写c,你可以引入头文件比如windows.h,显然这个库是Linux不具有的。简单说系统调用库根据具体的 *** 作系统环境不同而不同,而c标准库,是所有支持c语言编译器都有的。
评论列表(0条)