操作系统-系统调用

时间:2021-09-21 02:49:09   收藏:0   阅读:25

系统调用概述

系统调用:运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。

技术分享图片 技术分享图片

系统调用需要了解的点:

系统调用的详细过程

以x86-32为例,说明系统调用过程:

  1. 通过调用外壳(wrapper)函数发起系统调用(glibc)。

  2. 参数通过堆栈传入外壳函数,外壳函数会将上述参数复制到寄存器(系统调用最多使用6个)。

  3. 外壳函数将系统调用编号复制到eax寄存器中。

  4. 外壳函数执行中断机器指令(int 0x80),引发处理器从用户态切换到核心态,并执行系统中断0x80(十进制数128)的中断向量所指向的代码。

  5. 为响应中断0x80,内核会调用system_call()例程(位于汇编文件arch/i386/entry.S中)来处理中断,具体如下:

    5.1 在内核栈中保存寄存器值。

    5.2 审核系统调用编号是否有效。

    5.3 如果调用号有效,就去存放所有调用服务例程的列表中进行索引,发现并调用相应的系统调用服务例程。

    5.4 从内核栈中恢复各寄存器值,并将系统调用返回值置于栈中。

    5.5 返回至外壳函数,同时将处理器切换回用户态。

  6. 若系统调用服务例程的返回值表明调用有误,外壳函数会使用该值来设置全局变量 errno。然后,外壳函数会返回到调用程序,并同时返回一个整型值,以表明系统调用是否成功。

技术分享图片

其他

Linux常见的系统调用

技术分享图片

跟踪系统调用

Linux可以在命令行中使用 strace追踪系统调用 ,ltrace追踪库函数的调用。

Mac OS可以使用dtruss追踪系统调用。

reference

[1] UNIX 系统编程手册

[2] 现代操作系统

原文:https://www.cnblogs.com/cxl-/p/15310526.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!