系统调用、函数调用

1、系统调用

操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,

内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system
call)的接口呈现给用户。系统调用把应用程序的请求

传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。

现代的操作系统通常都具有多任务处理的功能,通常靠进程来实现。由于操作系统快速的在每个进程间切换执行,所以一切看起来就

会像是同时的。同时这也带来了很多安全问题,例如,一个进程可以轻易的修改进程的内存空间中的数据来使另一个进程异常或达到

一些目的,因此操作系统必须保证每一个进程都能安全的执行。这一问题的解决方法是在处理器中加入基址寄存器和界限寄存器。这

两个寄存器中的内容用硬件限制了对储存器的存取指令所访问的储存器的地址。这样就可以在系统切换进程时写入这两个寄存器的内

容到该进程被分配的地址范围,从而避免恶意软件。

为了防止用户程序修改基址寄存器和界限寄存器中的内容来达到访问其他内存空间的目的,这两个寄存器必须通过一些特殊的指令来

访问。通常,处理器设有两种模式:“用户模式”与“内核模式”,通过一个标签位来鉴别当前正处于什么模式。一些诸如修改基址寄存器

内容的指令只有在内核模式中可以执行,而处于用户模式的时候硬件会直接跳过这个指令并继续执行下一个。

同样,为了安全问题,一些I/O操作的指令都被限制在只有内核模式可以执行,因此操作系统有必要提供接口来为应用程序提供诸如读

取磁盘某位置的数据的接口,这些接口就被称为系统调用。

当操作系统接收到系统调用请求后,会让处理器进入内核模式,从而执行诸如I/O操作,修改基址寄存器内容等指令,而当处理完系统

调用内容后,操作系统会让处理器返回用户模式,来执行用户代码。

2、系统调用原理

操作系统中的状态分为管态(核心态)和目态(用户态)。特权指令:一类只能在核心态下运行而不能在用户态下运行的特殊指令。

不同的操作系统特权指令会有所差异,但是一般来说主要是和硬件相关的一些指令。访管指令:本身是一条特殊的指令,但不是特权指令。

(trap指令)。基本功能:“自愿进管”,能引起访管异常。

用户程序只在用户态下运行,有时需要访问系统核心功能,这时通过系统调用接口使用系统调用。

3、系统调用与过程(函数)调用的区别

程序中执行系统调用或过程(函数)调用,虽然都是对某种功能或服务的需求,但两者从调用形式到具体实现都有很大区别。

(1)调用形式不同。

过程(函数)使用一般调用指令,其转向地址是固定不变的,包含在跳转语句中;但系统调用中不包含处理程序入口,而仅仅提供功能号,

按功能号调用。

(2)被调用代码的位置不同。

过程(函数)调用是一种静态调用,调用者和被调用代码在同一程序内,经过连接编辑后作为目标代码的一部份。当过程(函数)升级或

修改时,必须重新编译连结。而系统调用是一种动态调用,系统调用的处理代码在调用程序之外(在操作系统中),这样一来,系统调用

处理代码升级或修改时,与调用程序无关。而且,调用程序的长度也大大缩短,减少了调用程序占用的存储空间。

(3)提供方式不同。

过程(函数)往往由编译系统提供,不同编译系统提供的过程(函数)可以不同;系统调用由操作系统提供,一旦操作系统设计好,

系统调用的功能、种类与数量便固定不变了。

(4)调用的实现不同。

程序使用一般机器指令(跳转指令)来调用过程(函数),是在用户态运行的;程序执行系统调用,是通过中断机构来实现,需要从

用户态转变到核心态,在管理状态执行,因此,安全性好。

4、库函数调用与系统调用的区别

函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。

库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环

境切换到内核模式。

说明:本文内容来自百度百科,以及操作系统书中。

时间: 2024-10-27 19:23:37

系统调用、函数调用的相关文章

套接字之close系统调用

close系统调用用于关闭文件描述符,其系统调用实现如下所示: 1 / 2 * Careful here! We test whether the file pointer is NULL before 3 * releasing the fd. This ensures that one clone task can't release 4 * an fd while another clone is opening it. 5 */ 6 SYSCALL_DEFINE1(close, unsi

套接字之select系统调用

select是IO多路复用的一种方式,用来等待一个列表中的多个描述符的可读可写状态: 1 SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp, 2 fd_set __user *, exp, struct timeval __user *, tvp) 3 { 4 struct timespec64 end_time, *to = NULL; 5 struct timeval tv; 6 int r

系统调用与函数调用

函数调用 看这样一段代码: int main() { printf("Hello,world!"); return 0; } 其中用到了printf函数,函数从标准C库中调用,实际上是进入到内核态调用write()函数. 系统调用 应用程序通过系统调用接口进入内核,首先通过中断向量表转移到系统调用表,每一个系统调用都有对应的编号,根据编号实现相应的操作并返回. 系统调用与函数调用的区别 系统调用:指令int和IRET 堆栈切换(内核和用户态使用不同堆栈),特权级的转换 函数调用:cal

系统调用和函数调用的区别

系统调用 操作系统服务的编程接口 通常由高级语言编写(C或C++) 程序访问通常通过高层次 的API接口(C标准库的库函数)而不是直接进行系统调用 每个系统调用对应一个系统调用编号 系统调用与函数调用的区别 系统调用 1.使用INT和IRET指令,内核和应用程序使用的是不同的堆栈,因此存在堆栈的切换,从用户态切换到内核态,从而可以使用特权指令操控设备 2.依赖于内核,不保证移植性 3.在用户空间和内核上下文环境间切换,开销较大 4. 是操作系统的一个入口点 函数调用 1.使用CALL和RET指令

Linux C 文件操作 -- 系统调用(open(),read()...) 和 标准I/O库(fopen(),fread()...)

一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等.但是在Linux中,文件的概念还远不止于这些,在Linux中,一切(或几乎一切)都是文件.文件包括很多的内容,例如:大家知道的普通文件是文件,目录也是一个文件,设备也是一个文件,管道也是一个文件等等.对于目录.设备这些的操作也可以完全等同于对纯文本文件的操作,这也是Linux非常成功的特性之一吧.

基于int的Linux的经典系统调用实现

 先说明两个概念:中断和系统调用 一 系统调用: 是应用程序(运行库也是应用程序的一部分)与操作系统内核之间的接口,它决定了应用程序是如何和内核打交道的. 1,  Linux系统调用:2.6.19版内核提供了319个系统调用.比如 exit fork read open close …… 2,  对Windows来说,操作系统提供给应用程序的接口不是系统调用,而是API.比如:ReadFile.我们暂时把API和系统调用等同起来 3,  Linux中,每个系统调用对应一个系统调用号,内核维护了一

x86函数调用约定

以下摘自<IDA Pro>,貌似有一些细节之处没有交代清楚呢,需要进一步思考.实践. 了解栈帧的基本概念后,接下来详细介绍它们的结构.下面的例子涉及x86体系结构和与常见的x86编译器(如Microsoft Visual C/C++或GNU的gcc/g++)有关的行为.创建栈帧的最重要的步骤是,通过调用函数将函数存入栈中.调用函数必须存储被调用函数所需要的参数,否则可能导致严重的问题.各个函数会选择并遵照某一特定的调用约定,以表明他们希望以何种方式接收参数. 调用约定指定调用方放置函数所需参数

linux文件系统调用(1)---mount

术语表: struct mount:挂载点 struct mountpoint挂载点节点 struct vfsmount:挂载项 源文件系统用户将要挂载的文件系统 目的文件系统挂载源文件系统的文件系统 一.目的 本文将介绍linux挂载文件系统的过程,从系统调用mount()函数开始解析,主要分为三个阶段: 1.新建源文件系统: 2.查找目的文件系统的挂载目录: 3.将源文件系统挂载到目的文件系统的挂载目录: 本文以linux 3.10版本为基础进行讲解. 二.函数调用关系 mount系统调用的

[文件系统]文件系统学习笔记(八)---mount系统调用(代码相关)

一,mount系统调用--相关代码源码位置:kernel/fs/Namespace.c文件的do_mount()函数, [cpp] view plaincopy long do_mount(char *dev_name,char*dir_name,char*type_page,unsigned long flags,void *data_page) dev_name指的是要挂载文件系统的名字,如tmpfs,dir_name指的是文件系统要被挂载的目标目录type_page指的是要挂载的文件系统的