系统调用

        前言: 我们在上Linux时,会遇见fork(),我在想创建一个新的进程不是有系统来处理吗,我们随便用个函数就行了吗?在查找答案过程中,知道了系统调用函数,所以打算深入下去。以下是我的总结:

        1.为什么要有系统调用?

        程序在运行时,本身没有权利访问多少系统资源(文件,网络,IO,各种设备等等),由于系统有限的资源有可能被多个不同的运用程序同时访问,因此如果不加以保护,那么各个运用程序难免不会发生冲突,所以现代系统都将可能发生冲突的资源保护起来,阻止运用程序直接访问。

        2.系统调用的实现

        操作系统给用户提供一套接口,以供使用,这些接口通过中断(一个硬件或软件发出请求,要求cpu暂停当前工作,转手去处理更加重要的事情)来实现,比如Linux使用0x80号中断作为系统调用的入口,Windows采用0x2E号中断。

       3.系统调用的弊端

                   a使用不便;系统调用接口往往过于原始,程序员需要了解很多与操作系统相关的细节,如果没有进行很好的包装,使用会产生不便。

                   b各个操作系统之间系统调用不兼容。Windows,linux,Unix就基本上不同,虽然内容很多一样,但他们定义和实现大不一样。

                   

                   如何解决:运行库的实现,特点:1.使用简便,2.形式统一。运行库有它自己的标准,叫标准库,凡是所有遵循这个标准的运行库理论上都是相互兼容的

 比如c语言下的fread,用于读取文件,在windows下,调用ReadFile这个API(先等同于系统调用,其实不是),在Linux下调用read。但不管在哪个平台,大家都可以使用运行库中fread()这个函数。

        



          接下来说说特权级,分别为用户态和内核态。操作系统可以让不同的代码运行在不同的模式上,以限制他们的权利,提高稳定性,安全性。普通程序运行在用户态,诸多操作将受到限制,包括访问硬件设备,开关中断,改变特权模式等。高特权级的代码是可以降为低等级的,但低等级就不是那么容易转换为高等级的了。系统调用发生在内核态,而基本运用程序运行于用户态,操作系统一般通过中断来将用户态切换到内核态。(比如你在敲键盘时,CPU不去管你是否敲下了键盘,敲下时键盘的芯片会发一个信号给CPU,CPU收到后知道键盘被按下了,再去询问键盘被按下了那个键,这样的一种信号就是中断

           中断有两个属性,一个是中断号,一个是中断处理程序,不同的中断据用不同的中断号,与中断处理程序一一对应。

           以fork为例的Linux系统调用的执行程序

用户代码执行到fork(),会产生一个中断号,同时得到eax寄存器中的系统调用函数的接口号,系统由用户态切换到内核态,CPU收到中断会去中断向量表中(是一个数组,里面放着指向中断处理程序的指针)查找下标为中断号的指针,再根据指针去处理相应的中断处理函数,中断处理函数根据系统调用函数的接口号eax=2,去查找系统调用表,最后找到sys_fork,并执行。当sys_fork执行完,内核态在切换到用户态,执行接下来的代码。

             

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值