linux 系统调用浅析

%eax |
Name |
%ebx |
%ecx |
%edx |
%esx |
%edi |
1 |
sys_exit |
int |
- |
- |
- |
- |
2 |
sys_fork |
struct pt_regs |
- |
- |
- |
- |
3 |
sys_read |
unsigned int |
char * |
size_t |
- |
- |
4 |
sys_write |
unsigned int |
const char * |
size_t |
- |
- |
5 |
sys_open |
const char * |
int |
int |
- |
- |
6 |
sys_close |
unsigned int |
- |
- |
- |
- |
|
常规函数调用 (不涉及到系统特权级别改变) |
系统调用
|
传入参数的约定 | 32bit系统下,常用ebp一个进行寻址 |
个数为6个,
超过6个的话,利用ebx
一次系统调用中,只使用ebx、ecx、edx、esi、edi五个寄存器来保存相对程序来说的输入数据,这些输入数据其实是传递给在系统调用过程中所访问的内核函数的实参。输入数据被保存的顺序如下:
对于超过六个参数的情况是使用ebx保存相继而存的数据所在内存的起始地址。系统调用通过ebx内的地址访问这些数据。 |
返回错误码 |
系统变量errno
|
需要用户指定接受变量
|


#include <stdio.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <errno.h>
int main()
{
long rc;
char *file_name
= "/etc/passwd";
unsigned short mode
= 0444;
asm(
"int $0x80"
: "=a" (rc)
: "0" (SYS_chmod), "b" ((long)file_name), "c" ((long)mode)
);
if ((unsigned long)rc
>= (unsigned long)-132)
{
errno = -rc;
rc = -1;
}
if (rc == -1)
fprintf(stderr, "chmode
failed, errno = %d\n", errno);
else
printf("success!\n");
return 0;
}

