从用户态切换到内核态

      在Linux系统中,每个系统调用被赋予一个系统调用号。这样通过这个系统调用号就可以关联系统调用。当用户空间执行的进程执行一个系统调用的时候,这个系统调用号就告诉内核需要调用哪个。

      内核记录了系统调表中所有已注册过的系统调用的列表,这个表为每一个有效的系统调用指定了唯一的系统调用号。

     用户空间程序无法完成的代码。它们不能直接调用内核的中的函数,因为内核驻留在受保护的地址空间上。所以应运程序必先通知系统,告诉自己需要一个系统调用,希望系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用。

      Linux系统是依靠软中断来实现用户态到内核态的切换,具体过程可以分为一下步骤:

  • 在用户执行到调用系统调用出引发一个异常,这个异常就是触发了int&0x80指令。
  • int&0x80指令会导致系统切换到内核态,并执行第128号异常(中断)处理
  • 而128号异常处理程序就是用来执行系统调用,其实现是调用了system_call()来执行具体的系统调用,这是system_call()会根据系统调用号来确定调用哪一个函数。用户程序会将调用的系统调用号通过eax寄存器传入到内核,内核根据系统调用号来确定执行哪一个系统调用。

参数传递:系统调用号是通过eax寄存器传递给内核的,而对应的系统调用可能需要一些参数,ebx、ecx、edx、esi、edi这五个寄存器是用来传递系统调用参数的,如果出现参数大于五个的话,那就需要创建一个堆栈,用一个单独的寄存器来保存这个堆栈的地址,从而将参数传递到内核态

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值