系统调用_系统调用原理 - CSDN
  • 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,...

    什么是系统调用?

    Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。

    随Linux核心还提供了一些C语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。

    展开全文
  • 系统调用

    2019-04-30 13:38:08
    本文主要简单的说明什么是系统调用,以及系统调用是如何实现的。

    作者:爱写程序的阿波张

    公众号:go语言核心编程技术

     

    本文是《go调度器源代码情景分析》系列 第一章 预备知识的第7小节。

     

    我们将在最后一章讨论goroutine的有关系统调用方面的抢占调度,所以这里先对系统调用做个基本的介绍。

    系统调用是指使用类似函数调用的方式调用操作系统提供的API。

    虽然从概念上来说系统调用和函数调用差不多,但本质上它们有很大的不同,操作系统的代码位于内核地址空间,而CPU在执行用户代码时特权等级很低,无权访问需要最高优先级才能访问的内核地址空间的代码和数据,所以不能通过简单的call指令直接调用操作系统提供的函数,而需要使用特殊的指令进入操作系统内核完成指定的功能。

    另外,用户代码调用操作系统API也不是根据函数名直接调用,而是需要根据操作系统为每个API提供的一个整型编号来调用,AMD64 Linux平台约定在进行系统调用时使用rax寄存器存放系统调用编号,同时约定使用rdi, rsi, rdx, r10, r8和r9来传递前6个系统调用参数。

    可能有读者会说,我们平时编程也没有用到系统调用啊?!其实并不是没有用到,而是我们没有感觉到它的存在,比如最简单的向屏幕输出字符串,打开文件,读写文件以及网络编程中的创建socket等等都使用了系统调用,我们没有感觉到系统调用的存在主要是因为我们使用的函数库或package把它们封装成了函数,我们只需要直接调用这些函数就可以了。比如有下面一段go代码:

    package main
    
    import(
            "os"
    )
    
    funcmain() {
            fd, err:=os.Open("./syscall.go")  // 将会使用系统调用打开文件
            ......
            fd.Close()  // 将会使用系统调用关闭文件
    }

    这里的os.Open()和fd.Close()函数最终都会通过系统调用进入操作系统内核完成相应的功能。以os.Open为例,在Go语言的实现中它最终会执行下面这段汇编代码来通过openat系统调用打开文件:

    mov   0x10(%rsp),%rdi #第1个参数
    mov   0x18(%rsp),%rsi #第2个参数
    mov   0x20(%rsp),%rdx #第3个参数
    mov   0x28(%rsp),%r10 #第4个参数
    mov   0x30(%rsp),%r8  #第5个参数
    mov   0x38(%rsp),%r9  #第6个参数
    mov   0x8(%rsp),%rax  #系统调用编号 rax = 267,表示调用openat系统调用
    syscall               #系统调用指令,进入Linux内核

    这里,代码首先把6个参数(openat系统调用其实没有这么多参数,这是Go的底层实现,内核并不会使用多余无用的参数)以及openat这个系统调用的编号267保存在了对应的寄存器中,然后使用syscall指令进入内核执行打开文件的功能。

    展开全文
  • 在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向 操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口( 即系统调用是用户程序和内核...

    参考回答:

    1)概念:

    在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向
    操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口(
    即系统调用是用户程序和内核交互的接口)。
    
    操作系统中的状态分为管态(核心态)和目态(用户态)。大多数系统交互式操作需求在内核态
    执行。如设备IO操作或者进程间通信。特权指令:一类只能在核心态下运行而不能在用户态下运
    行的特殊指令。不同的操作系统特权指令会有所差异,但是一般来说主要是和硬件相关的一些指
    令。用户程序只在用户态下运行,有时需要访问系统核心功能,这时通过系统调用接口使用系统
    调用。
    
    应用程序有时会需要一些危险的、权限很高的指令,如果把这些权限放心地交给用户程序是很危
    险的(比如一个进程可能修改另一个进程的内存区,导致其不能运行),但是又不能完全不给这些
    权限。于是有了系统调用,危险的指令被包装成系统调用,用户程序只能调用而无权自己运行那
    些危险的指令。另外,计算机硬件的资源是有限的,为了更好的管理这些资源,所有的资源都由
    操作系统控制,进程只能向操作系统请求这些资源。操作系统是这些资源的唯一入口,这个入口
    就是系统调用。
    

    2)系统调用举例:

    对文件进行写操作,程序向打开的文件写入字符串“hello world”,open和write都是系统调用。如下:
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<errno.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    int main(int argc, char *argv[])
    {
        if (argc<2)
            return 0;
        //用读写追加方式打开一个已经存在的文件
        int fd = open(argv[1], O_RDWR | O_APPEND);
        if (fd == -1)
        {
            printf("error is %s\n", strerror(errno));
        }
        else
        {
            //打印文件描述符号
            printf("success fd = %d\n", fd);
            char buf[100];
            memset(buf, 0, sizeof(buf));
            strcpy(buf, "hello world\n");
            write(fd, buf, strlen(buf));
            close(fd);
        }
        return 0;
    }
    还有写数据write,创建进程fork,vfork等都是系统调用。
    
    展开全文
  • 操作系统的系统调用

    千次阅读 2020-08-24 14:05:59
    系统调用:操作系统的接口是连接应用软件与操作系统的中间桥梁。接口在程序设计中表现的形式就是:函数。操作系统提供的函数就被称为系统调用(system call)。这里有个标准POSIX(Portable Operating System ...

    首先,有一个概念叫做接口。抽象而言的接口是连接两个东西的中间物。接口的好处是屏蔽了连接起来的实际细节。我们只关心接口如何使用。

    系统调用:操作系统的接口是连接应用软件与操作系统的中间桥梁。接口在程序设计中表现的形式就是:函数。操作系统提供的函数就被称为系统调用(system call)。这里有个标准POSIX(Portable Operating System Interface of UNIX,缩写为 POSIX ),它定义了操作系统应该为应用程序所提供的标准接口。Linux和Unix等系统遵守这个标准。

    系统调用的实现:系统调用的存在给用户提供了接口,阻止了用户恶意访问操作系统的数据。系统调用也给用户访问内核提供了唯一的途径。计算机硬件的设计解决了这个问题的具体实现。它将内核程序和用户程序隔离。内核程序处于内核态,用户程序处于用户态。Intel的X86CPU使用CS寄存器的最低两位来表示:0是内核态,1和2是OS服务,3是用户态。我们把CS的最低的两位叫做CPL,它代表了当前程序的级别。DPL是调用目标段的代码级别。只有当DPL≥CPL时,才能访问。在系统初始化的时候,把操作系统相关的GDT表中的DPL设置为0,把用户态设置为3。

    对于Intel X86而言,它进入内核的方式是中断指令int。因此进入内核的方式就是用户函数包含一段int指令的代码。这段代码将会导致操作系统中断,然后获取到想调用的程序的编号。OS根据这个编号来执行相应的代码。int这个指令将DPL更改为3,使得CPL == DPL。这样就进入了内核,然后将CPL设为0,等执行完后,在把CPL=3,返回用户态。系统调用实现的细节是这样的,它在代码中嵌入了一段汇编代码,这段代码中最重要的是int 0x80指令。这将会启动系统调用。当然我们还有系统调用号。 int指令在IDT表中查找系统调用的入口。这样就实现了系统调用。

    展开全文
  • 系统调用的实现

    千次阅读 2018-07-04 11:24:42
  • 01、 系统调用是什么 操作系统提供给程序员的接口就是系统调用。 进程在系统上的运行分为2个级别: (1) 用户态(user mode):用户态运行的进程可以直接读取用户程序的数据; (2) 系统态(kernel mode):系统态...
  • 系统调用是什么

    千次阅读 2018-08-09 11:12:17
    系统调用 1.系统调用和普通函数完全不同,系统调用实际上是0x80号中断对应的中断处理程序的子程序。换句话说,在linux系统上,0x80中断是系统调用的统一入口。某个具体的系统调用是这个中断处理程序的子程序,进入...
  • 这些函数及调用函数的行为统称为系统调用(system call),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了time()及printf()等函数,这些函数内部也都使用了系统调用。这里之...
  • 操作系统作业:给linux系统增加一个系统调用

    万次阅读 多人点赞 2019-05-07 21:36:56
    前不久开了一门《操作系统》,老师上课留下了一个作业——给Linux系统添加一个系统调用。刚开始只能用一脸懵逼来形容,只能硬着头皮做下去。由于刚的新电脑,所以就没敢装双系统。所以我选择了虚拟机,虚拟机刚开始...
  • 然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递系统调用号和参数,执行正确的系统调用函数,并把返回值带回用户空间。最后讨论了如何增加系统调用,并提供了从用户空间...
  • 系统调用和库函数调用的区别

    千次阅读 2018-09-04 16:20:02
    一:系统调用和库函数调用的区别: 1:系统调用是最底层的应用,是面向硬件的。而库函数的调用是面向开发的,相当于应用程序的API(即预先定义好的函数)接口; 2:各个操作系统的系统调用是不同的,因此系统调用...
  • 系统调用和函数调用的区别

    万次阅读 2018-07-03 01:17:08
    系统调用 操作系统服务的编程接口 通常由高级语言编写(C或C++) 程序访问通常通过高层次 的API接口(C标准库的库函数)而不是直接进行系统调用 每个系统调用对应一个系统调用编号 系统调用与函数调用的区别 ...
  • 操作系统中系统调用的执行过程

    千次阅读 2019-02-21 12:56:59
    1、硬件接收到中断信号,立刻保存现场,并查找中断向量表,将CPU控制权转交给系统调用总入口程序。 2、对于系统调用总入口程序,也要先保存现场,将参数保存在内核的堆栈中。然后查找系统调用表,将CPU控制权转交给...
  • read 系统调用剖析

    千次阅读 2015-11-20 17:46:04
    Read 系统调用在用户空间中的处理过程 Linux 系统调用(SCI,system call interface)的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是 0x80 中断这个入口点(X86 系统结构)。也就是说,所有系统调用...
  • C++ 函数调用和系统调用的区别

    千次阅读 2018-02-06 11:10:07
     所谓系统调用就是用户在程序中调用操作系统所提供的一个子功能,也就是系统API,系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如...
  • 系统调用和库函数的区别

    千次阅读 2019-03-13 16:06:55
    原文地址系统调用和库函数的区别 前言 从用户的角度来看,系统调用和库函数似乎没有什么区别,它们都是以C函数的形式出现,并且两者都为应用程序提供服务。但从实现者角度来看,它们之间是有根本的区别。那么,...
  • 系统调用和函数调用区别

    千次阅读 2017-11-02 15:22:56
    系统调用和函数调用 1. 系统调用 a. 什么是系统调用 系统调用,通俗的讲,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以...
  • linux系统调用原理及实现

    千次阅读 2018-09-18 10:19:13
    linux系统调用 系统调用是linux内核为用户态程序提供的主要功能接口。通过系统调用,用户态进程能够临时切换到内核态,使用内核态才能访问的硬件和资源完成特定功能。系统调用由linux内核和内核模块实现,内核在...
  • 系统调用与库函数调用

    千次阅读 2017-01-17 21:15:43
    对上的话则暴露出来一些接口,供上层调用,这些接口就叫做系统调用。shell是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机交互界面。库函数是在系统调用的基础上
  • 系统调用、函数调用

    千次阅读 2015-04-16 09:43:39
    1、系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system ...
1 2 3 4 5 ... 20
收藏数 2,948,189
精华内容 1,179,275
关键字:

系统调用