Linux 系统调用详解

系统调用

系统调用是操作系统提供给用户程序调用系统服务的一组“特殊”接口。



前言

在这里插入图片描述



系统调用

系统调用可被看成是一个内核与用户空间程序交互的接口,它把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。

在这里插入图片描述



系统调用的作用


  • 把用户从底层的硬件编程中解放出来
与具体的硬件完全隔离,用户不需要面向具体的硬件编码,降低了开发的复杂性和难度。极大的提高了系统的安全性
  • 将用户进程隔离实现内核“保护”
用户进程不允许访问内核数据,也无法使用内核函数。用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的陷入内核的统一访问路径限制才能保证内核安全无误。
  • 使用户程序具有可移植性


中断实现系统调用


软件中断

它是通过软件指令触发的中断。Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。

系统调用控制程序执行软件中断的过程如下:

1.在进程的内核态堆栈中保存大多数寄存器的内容(即保存恢复进程到用户态执行所需要的上下文)

2.根据用户态传递的系统调用号,确定系统调用的执行程序

3.调用相应的执行程序来处理系统调用

4.从系统调用返回



系统调用号和系统调用表


系统调用号:

每个系统调用被赋予一个系统调用号,与具体的系统调用相关联。

在这里插入图片描述

系统调用表:

内核维护系统调用表,保存系统调用函数的起始地址,系统调用号对应系统调用在调用表中的偏移量。

在这里插入图片描述



执行系统调用


glibc库

glibc是Linux下使用的开源的标准C库,它是GNU发布的libc库,即运行时库。

syscall 调用

glibc提供的syscall函数,直接调用。



glibc库

  • 每个特定的系统调用对应了至少一个glibc封装的库函数
  • 多个API也可能只对应同一个系统调用
  • 返回值-1在多数情况下表示内核不能满足进程的请求
  • Libc中定义的errno变量包含特定的错误码在这里插入图片描述


glibc函数库对比Syscall调用

优势劣势
glibc函数库只需了解glibc提供的API的原型,无须知道更多的细节,如系统调用号。其次,更好的移植性没有封装某个内核提供的系统调用时无法使用
syscall调用可定制自己的系统调用使用起来不方便
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

necesse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值