开源中文网

您的位置: 首页 > 编程开发 > C语言 > 正文

linux系统调用system call,exit函数

来源:  作者:

linux系统调用就是linux内核提供了一系列函数(服务)供用户应用程序调用,这些函数的功能在内核中实现,以一定的方式把系统调用给用户,一般以gate trap方式实现,(我理解是软中断方式)。

    我们编程时用到的很多函数如fork,exit等最终都是系统调用实现的。fork,exit都是glibc里的函数,看glibc里这两个函数的实现代码都是以软中断的方式陷入到内核中,再通过系统调用实现函数的功能的。

    系统调用接口是软中断0x80:int 0x80,所有系统调用都用这个中断。
    EAX放入系统调用函数号,说明是哪一个系统函数被调用,系统调用函数号可以在/usr/include/linux/unistd.h查。
    EBX放入第一个参数,随后的参数可依次放入edx, esi,edi。

   例如,我们要系统调用exit函数,以下两段代码执行结果一样。

_start:
                push    dword 42
                call    _exit//使用glibc
====>
_start:
                mov     eax, 1   //1是exit的系统调用函数号
                mov     ebx, 42
                int     0x80//不使用glibc,直接系统调用

glibc与系统调用


glibc中的exit()函数
     \stdlib\exit.c里exit()调用_exit()函数
     \sysdeps\unix\sysv\linux\i386\_exit.S下

.global _exit
_exit:
    movl 4(%esp), %ebx 
    movl $__NR_exit, %eax
    int $0x80
    hlt

应用程序利用glibc提供的函数做系统调用,看一下glibc的介绍就知道了,它实际上就是给系统调用服务的。
    Any Unix-like operating system needs a C library: the library which defines the ``system calls'' and other basic facilities such as open, malloc, printf, exit...
    The GNU C library is used as the C library in the GNU system and most systems with the Linux kernel.

调用:user program ==> glibc ==>kernel ==> system call
返回:user program <== glibc <==kernel <== system call
如图所示:

系统调用列表

系统调用主要包含以下几种,只举一两个例子:

1.进程控制:如fork,exit,创建终止进程等。

2.文件系统控制:如open,read,文件打开关闭和读写操作等。

3.系统控制:如ioctl,reboot,I/O总控制函数和重启等。

4.内存管理:brk,mlock,munlock,改变数据段空间分配,内存页面加锁解锁等。

5.网络管理:gethostid\ 获取主机标识号等。

6.socket控制:socket,bind,connect,accept,建立,绑定,响应socket等。

7.用户管理:getuid,获取用户标识号等。

8.进程间通信:ipc,shmget,进程间通信总控制调用,获取共享内存等。

跟踪系统调用strace

strace ./a.out

strace date

显示执行命令过程中所执行的各个系统调用。看到加载共享库、映射内存,跟踪到的是在标准输出中信息等。

[参考]

1.使用 Linux 系统调用的内核命令探究 SCI 并添加自己的调用,M. Tim Jones,网址

2.Linux系统调用列表,雷镇,网址

这篇教你怎么添加自己的系统调用:

Implementing a System Call on Linux 2.6 for i386,Amit Choudhary,网址

hi~北风北的猪最后编辑于2010/09/25

Tags:函数 系统
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明