浅谈Linux系统调用

一、系统调用

       什么是系统调用呢?所谓系统调用就是用户在程序中调用操作系统所提供的一些子功能,系统调用可以被看作特殊的公共子程序。它把用户从底层的硬件编程中解放出来,极大的提高了系统的安全性,同时也使用户程序移植性变为可能。

       说道系统调用就不得不说我们程序员熟悉的API(application program interface)。API只是一个函数定义,而系统调用通过软中断向内核发出一个明确的请求。注意不是每个API都对应一个特定的系统调用。也就是说API和系统调用不是一一对应的,API可能直接提供用户态的服务,或者一个单独的API可能调用几个系统调用,甚至不同的API可能调用了同一个系统调用。

       系统调用大致实现过程:应用程序调用相关API;API将对应的系统调用号存入eax,然后调用int $0x80触发中断进入内核中的中断处理函数;进行地址空间的转换和堆栈的切换,执行SAVE_ALL;进行中断处理,根据系统调用表调用内核函数; 执行内核函数;最后RESTORE_ALL并返回用户模式。


二、系统调用的例子


        原理讲了一堆,我们还是痛过一个非常简单小程序来感受下整个过程大概是怎样的。
       c语言代码如下:

 

       我们来编译运行下,看看效果:



       我们可以清楚看到当前进程的ID是7301。

       我还准备了一个内嵌式汇编版本的程序,可以对照着看,以加深理解:



       可以清楚看到,就是把原本的系统调用语句换成了一段汇编代码。系统调用传递第一个参数用的是ebx,将它置零。接着把系统调用号传给eax(一般用eax传递系统调用号的参数),getpid的号为20。然后进入int 0x80中断。最后系统调用返回,返回值和普通函数一样,都存在eax中。这里把eax值放到pid中,也就是我们最后看到了进程号。



       最后也可以看到进程号。注意,进程号不同是正常的。
       

三、小结

       总结下系统调用大致实现过程:首先应用程序调用相关API;API将对应的系统调用号存入eax,然后调用int $0x80触发中断进入内核中的中断处理函数;进行地址空间的转换和堆栈的切换,执行SAVE_ALL进行中断处理,根据系统调用表调用内核函数 执行内核函数在内核中首先执行system_call 函数最后RESTORE_ALL并返回用户态。
       系统调用也是需要输入输出参数的。其中系统调用号存在eax中。另外每个参数的长度不能超过寄存器的长度,参数个数一般小于6个。 
             

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值