系统调用system_call的处理过程

朱秀秀 原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

    通常,在OS的核心中都设置了一组用来实现各种系统功能的子程序(过程),并把它们提供给用户调用,每当用户在需要系统提供某种服务的时候,就可以利用系统调用指令去调用系统过程。在调用系统过程之后,程序运行就由用户态转到内核态,相应的栈也由用户栈,转到内核栈,并且进行了相当于保护现场的工作,把当前的状态,栈顶指针,cs:eip保存到内核栈中。通过中断进入内核态,返回的时候,需要重新调度(所以不一定直接返回到调用过程),同时通过iret操作恢复现场。

    系统调用过程比较简单,它由0x80中断向量进入系统调用入口,通过使用系统调用表保存系统服务函数的地址的形式实现。具体的流程可以用下图所示:

 

    0x80将控制传递给核心。0x80就是系统调用的一个矢量地址。这个中断矢量表是在系统启动时就初始化好的,以及一些矢量地址,如系统时钟。当用户系统调用时,执行如下:                                                         

    每个系统调用都通过lib库体现。每一个系统调用在lib库中一般是一个宏syscallX(),X是具体某个调用的数字参数。有的系统调用更复杂,因为它们有可变
的参数列表,但它们仍用一样的入口指针.每个系统调用宏将展开成一个汇编段,用来建立调用的堆栈段,然后通过调用中断int $0x80调用--ENTRY(system_call).

系统调用处理过程”的理解:它由0x80中断向量进入系统调用入口,通过使用系统调用表保存系统服务函数的地址的形式实现

转载于:https://www.cnblogs.com/crystal-challenging/p/4394061.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值