系统调用

关于系统调用的描述,错误的是:(B)

A 系统调用把应用程序的请求传输给系统内核执行;

B 系统调用中被调用的过程运行在“用户态”中;

C 利用系统调用能够得到操作系统提供的多种服务

D 是操作系统提供给编程人员的接口

E 系统调用给用户屏蔽了设备访问的细节

F 系统调用保护了一些智能在内核模式执行的操作指令


分析:用户空间与系统空间所在的内存区间不一样,同样,对于这两种区间,CPU的运行状态也不一样。 在用户空间中,CPU处于"用户态";在系统空间中,CPU处于"系统态"。




系统调用概述 系统调用的实现原理

        计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)

        系统调用是属于操作系统内核的一部分的,必须以某种方式提供给进程让它们去调用。CPU可以在不同的特权级别下运行,而相应的操作系统也有不同的运行级别,用户态和内核态。运行在内核态的进程可以毫无限制的访问各种资源,而在用户态下的用户进程的各种操作都有着限制,比如不能随意的访问内存、不能开闭中断以及切换运行的特权级别。显然,属于内核的系统调用一定是运行在内核态下,但是如何切换到内核态呢?

        答案是中断。操作系统一般是通过中断从用户态切换到内核态。中断就是一个硬件或软件请求,要求CPU暂停当前的工作,去处理更重要的事情。比如,在x86机器上可以通过int指令进行软件中断,而在磁盘完成读写操作后会向CPU发起硬件中断。

        中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。

        一般地,系统调用都是通过中断实现的,比如,Linux下中断号0x80就是进行系统调用的。



系统调用的意义:系统调用过程
      操作系统为用户态进程与硬件设备进行交互提供了一组接口——系统调用:1.把用户从底层的硬件编程中解放了出来;2.极大地提高了系统的安全性使用户程序具有可移植性;用户程序与具体硬件已经被抽象接口所替代。

操作系统提供的API和系统调用的关系:
    API(应用程序编程接口)和系统调用:应用编程接口和系统调用是不同的:1.API只是一个函数定义;2.系统调用通过软中断向内核发出了一个明确的请求。
     Libc库定义的一些API引用了封装例成,唯一目的就是发布系统调用:1.一般每个系统调用对应一个封装例程;2.库函数再用这些封装例程定义出给用户的API(把系统调用封装成很多歌方便程序员使用的函数,不是每个API都对应一个特定的系统调用)
     API可能直接提供用户态的服务 如:一些数学函数 1.一个单独的API可能调用几个系统调用2.不同的API可能调用了同一个系统调用返回:大部分封装例程返回一个整数,其值的含义依赖于相应的系统调用-1在多数情况下表示内核不能满足进程的请求,Libc中定义的errno变量包含特定的出错码;

你可能感兴趣的:(操作系统)