精华内容
下载资源
问答
  • 系统调用

    千次阅读 2019-03-02 17:47:48
    程序接口通常是由各种类型的系统调用所组成的,因而,也可以说,系统调用提供了用户程序和操作系统之间的接口,应用程序通过系统调用实现其与 OS 的通信,并可取得它的服务。 处理器(CPU)=运算器+控制器+...

    程序接口是 OS 专门为用户程序设置的,也是用户程序取得 OS 服务的唯一途径。程序接口通常是由各种类型的系统调用所组成的,因而,也可以说,系统调用提供了用户程序和操作系统之间的接口,应用程序通过系统调用实现其与 OS 的通信,并可取得它的服务

     

    处理器(CPU)=运算器+控制器+寄存器+高速缓存

     

    系统调用的基本概念


    通常,在 OS 的核心中都设置了一组用于实现各种系统功能的子程序(过程),并将它们提供给应用程序调用。

     


    系统态和用户态


    在计算机系统中,通常运行着两类程序:系统程序和应用程序,为了保证系统程序不被应用程序有意或无意地破坏,为计算机设置了两种状态:

    • 系统态(也称为管态或核心态),操作系统在系统态运行
    • 用户态(也称为目态),应用程序只能在用户态运行。

    在实际运行过程中,处理机会在系统态和用户态间切换。相应地,现代多数操作系统将 CPU 的指令集分为特权指令和非特权指令两类。


    1) 特权指令——在系统态时运行的指令

    • 对内存空间的访问范围基本不受限制,不仅能访问用户存储空间,也能访问系统存储空间,
    • 特权指令只允许操作系统使用,不允许应用程序使用,否则会引起系统混乱。

     

    2) 非特权指令——在用户态时运行的指令

    一般应用程序所使用的都是非特权指令,它只能完成一般性的操作和任务,不能对系统中的硬件和软件直接进行访问,其对内存的访问范围也局限于用户空间。

     

     

    系统调用

     

    如上所述,一方面由于系统提供了保护机制,防止应用程序直接调用操作系统的过程,从而避免了系统的不安全性。但另一方面,应用程序又必须取得操作系统所提供的服务,否则,应用程序几乎无法作任何有价值的事情,甚至无法运行。为此,在操作系统中提供了系统调用,使应用程序可以通过系统调用的方法,间接调用操作系统的相关过程,取得相应的服务

    当应用程序中需要操作系统提供服务时,如请求 I/O 资源或执行 I/O 操作,应用程序必须使用系统调用命令。由操作系统捕获到该命令后,便将 CPU 的状态从用户态转换到系统态,然后执行操作系统中相应的子程序(例程),完成所需的功能。执行完成后,系统又将CPU 状态从系统态转换到用户态,再继续执行应用程序。

     

    系统调用和一般调用的区别:

    (1) 运行在不同的系统状态——调用程序是运行在用户态,而被调用程序是运行在系统态。

    (2) 状态的转换通过软中断进入

    • 一般的过程调用并不涉及到系统状态的转换,可直接由调用过程转向被调用过程。
    • 系统调用不允许由调用过程直接转向被调用过程。

    通常都是通过软中断机制,先由用户态转换为系统态,经核心分析后,才能转向相应的系统调用处理子程序。

    (3) 返回问题。

    在采用了抢占式(剥夺)调度方式的系统中,在被调用过程执行完后,要对系统中所有要求运行的进程做优先权分析。当调用进程仍具有最高优先级时,才返回到调用进程继续执行;否则,将引起重新调度,以便让优先权最高的进程优先执行。此时,将把调用进程放入就绪队列。

    (4) 嵌套调用。

    像一般过程一样,系统调用也可以嵌套进行,即在一个被调用过程的执行期间,还可以利用系统调用命令去调用另一个系统调用。当然,每个系统对嵌套调用的深度都有一定的限制,例如最大深度为 6。


    中断机制


    系统调用是通过中断机制实现的,并且一个操作系统的所有系统调用都通过同一个中断入口来实现。对于拥有保护机制的操作系统来说,中断机制本身也是受保护的,

     

     


    系统调用的类型


    对于一般通用的 OS 而言,可将其所提供的系统调用分为:进程控制、文件操纵、通信管理和系统维护等几大类。

     


    进程控制类系统调用


    这类系统调用主要用于对进程的控制,如创建一个新的进程和终止一个进程的运行,获得和设置进程属性等。


    1) 创建和终止进程的系统调用
    在多道程序环境下,为使多道程序能并发执行,必须先利用创建进程的系统调用来为欲参加并发执行的各程序分别创建一个进程。当进程已经执行结束时、 或因发生异常情况而不能继续执行时,可利用终止进程的系统调用来结束该进程的运行。

     

    2) 获得和设置进程属性的系统调用
    当我们创建了一个(些)新进程后,为了能控制它(们)的运行,应当能了解、 确定和重新设置它(们)的属性。这些属性包括: 进程标识符、进程优先级、最大允许执行时间等。此时,我们可利用获得进程属性的系统调用,来了解某进程的属性,利用设置进程属性的系统调用,来确定和重新设置进程的属性。


    3) 等待某事件出现的系统调用
    进程在运行过程中,有时需要等待某事件(条件)出现后方可继续执行。例如,一进程在创建了一个(些)新进程后,需要等待它(们)运行结束后,才能继续执行,此时可利用等待子进程结束的系统调用进行等待;

     


    文件操纵类系统调用


    对文件进行操纵的系统调用数量较多,有创建文件、删除文件、打开文件、关闭文件、读文件、写文件、建立目录、移动文件的读/写指针、改变文件的属性等。


    1) 创建和删除文件
    当用户需要在系统中存放程序或数据时,可利用创建文件的系统调用 creat,由系统根据用户提供的文件名和存取方式来创建一个新文件;当用户已不再需要某文件时,可利用删除文件的系统调用 unlink 将指名文件删除。


    2) 打开和关闭文件
    用户在第一次访问某个文件之前,应先利用打开文件的系统调用 open,将指名文件打开,即系统将在用户(程序)与该文件之间建立一条快捷通路。在文件被打开后,系统将给用户返回一个该文件的句柄或描述符;当用户不再访问某文件时,又可利用关闭文件的系统调用 close,将此文件关闭,即断开该用户程序与该文件之间的快捷通路。


    3) 读和写文件
    用户可利用读系统调用 read,从已打开的文件中读出给定数目的字符,并送至指定的缓冲区中;同样,用户也可利用写系统调用 write,从指定的缓冲区中将给定数目的字符写入指定文件中。read 和 write 两个系统调用是文件操纵类系统调用中使用最频繁的。

     


    进程通信类系统调用


    在 OS 中经常采用两种进程通信方式,即消息传递方式和共享存储区方式。

    当系统中采用消息传递方式时

    1. 先打开一个连接(由源进程发出一条打开连接的系统调用 open connection,目标进程则应利用接受连接的系统调用 accept connection
    2. 可以利用发送消息的系统调用 send message 或者用接收消息的系统调用 receive message 来交换信息。
    3. 通信结束后,还须再利用关闭连接的系统调用 close connection 结束通信。

    用户在利用共享存储区进行通信

    1. 先利用建立共享存储区的系统调用来建立一个共享存储区
    2. 再利用建立连接的系统调用将该共享存储区连接到进程自身的虚地址空间上
    3. 然后便可利用读和写共享存储区的系统调用实现相互通信。

    除上述的三类外,常用的系统调用还包括设备管理类系统调用和信息维护类系统调用,

     

     


    系统调用的实现

     

    系统调用的实现与一般过程调用的实现相比,两者间有很大差异。对于系统调用,控制是由原来的用户态转换为系统态,这是借助于中断和陷入机制来完成的,在该机制中包括中断和陷入硬件机构中断与陷入处理程序两部分。当应用程序使用 OS 的系统调用时,产生一条相应的指令,CPU 在执行这条指令时发生中断,并将有关信号送给中断和陷入硬件机构,该机构收到信号后,启动相关的中断与陷入处理程序进行处理,实现该系统调用所需要的功能。

     

    中断和陷入硬件机构

    1) 中断和陷入的概念(面试考点——中断与异常的区别)

    中断是指 CPU 对系统发生某事件时的这样一种响应: CPU 暂停正在执行的程序,在保留现场后自动地转去执行该事件的中断处理程序;执行完后,再返回到原程序的断点处继续执行。

    下图 表示中断时 CPU 的活动轨迹。还可进一步把中断分为外中断内中断

    • 外中断——是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
    • 内中断——是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。

    通常,陷入是由于执行了现行指令所引起的;而中断则是由于系统中某事件引起的,该事件与现行指令无关。由于系统调用引起的中断属于内中断,因此把由于系统调用引起中断的指令称为陷入指令。

     

    2) 中断和陷入向量(百度面试考过中断向量)
     

    • 针对不同的设备编制不同的中断处理程序,并把该程序的入口地址放在某特定的内存单元中。
    • 不同的设备也对应着不同的处理机状态字PSW,且把它放在与中断处理程序入口指针相邻接的特定单元中。

    在进行中断处理时,只要有了这样两个字,便可转入相应设备的中断处理程序,重新装配处理机的状态字和优先级,进行对该设备的处理。因此,我们把这两个字称为中断向量。相应地,把存放这两个字的单元称为中断向量单元

    类似地,对于陷入,也有陷入向量,不同的系统调用对应不同的陷入向量,在进行陷入处理时,根据陷入指令中的陷入向量,转入实现相应的系统调用功能的子程序,即陷入处理程序。由所有的中断向量和陷入向量构成了中断和陷入向量表,如图所示。

     

     

     

     


    UNIX 系统调用

     

     UNIX 系统调用的类型


    进程控制


    该类系统调用包括:创建进程的系统调用 fork、终止进程的系统调用 exit、等待子进程结束的系统调用 wait 等十多条。


    (1) 创建进程(fork)。

    一个进程可以利用 fork 系统调用来创建一个新进程。新进程是作为调用者的子进程,它继承了其父进程的环境、 已打开的所有文件、根目录和当前目录等,即它继承了父进程几乎所有的属性,并具有与其父进程基本上相同的进程映像。


    (2) 终止进程(exit)。

    一个进程可以利用 exit 实现自我终止。通常,在父进程创建子进程时,便在子进程的末尾安排一条 exit 系统调用。这样,子进程在完成规定的任务后,便可进行自我终止。子进程终止后,留下一记账信息 status,其中包含了子进程运行时记录下来的各种统计信息。


    (3) 等待子进程结束(wait)。

    wait 用于将调用者进程自身挂起,直至它的某一子进程终止为止。这样,父进程可以利用 wait 使自身的执行与子进程的终止同步。


    (4) 执行一个文件(exec)。

    exec 可使调用者进程的进程映像(包括用户程序和数据等)被一个可执行的文件覆盖,此即改变调用者进程的进程映像。该系统调用是 UNIX 系统中最复杂的系统调用之一。


    (5) 获得进程 ID。

    UNIX 系统提供了一组用于获得进程标识符的系统调用,比如,可利用 getpid 系统调用来获得调用进程的标识符,利用 getpgrp 系统调用来获得调用进程的进程组 ID,以及利用 getppid 系统调用来获得调用进程的父进程 ID 等。


    (6) 获得用户 ID。

    UNIX 系统提供了一组用于获得用户 ID 的系统调用,如 getuid 可用于获得真正的用户 ID,geteuid 用于获得有效用户 ID,getgid 用于获得真正用户组 ID 等。


    (7) 进程暂停(pause)。

    可用此系统调用将调用进程挂起,直至它收到一个信号为止。

     

     

    文件操纵


    用于对文件进行操纵的系统调用是数量最多的一类系统调用,其中包括创建文件、打开文件、关闭文件、读文件及写文件等二十多条。


    (1) 创建文件(creat)。

    系统调用 creat 的功能是根据用户提供的文件名和许可权方式,来创建一个新文件或重写一个已存文件。如果系统中不存在指名文件,核心便以给定的文件名和许可权方式来创建一个新文件;如果系统中已有同名文件,核心便释放其已有的数据块。创建后的文件随即被打开,并返回其文件描述符 fd。若 creat 执行失败,便返回“-1”。


    (2) 打开文件(open)。

    open 的功能是把有关的文件属性从磁盘拷贝到内存中,以及在用户和指名文件之间建立一条快捷的通路,并给用户返回一个文件描述符 fd。文件被打开后,用户对文件的任何操作都只须使用 fd 而非路径名。

     

    (3) 关闭文件(close)。

    在 UNIX 系统中,由于允许一个文件被多个进程所共享,故只有在无其他任何进程需要此文件时,才能真正关闭该文件


    (4) 读和写文件 read 和 write。

    仅当用户利用 open 打开指定文件后,方可调用 read 或write 对文件执行读或写操作。两个系统调用都要求用户提供三个输入参数:

    • ① 文件描述符fd。
    • ② buf 缓冲区首址。对读而言,这是用户所要求的信息传送的目标地址;对写而言,这则是信息传送的源地址。
    • ③ 用户要求传送的字节数 n byte。

    系统调用 read 的功能是试图从 fd 所指示的文件中去读入 n byte 个字节的数据,并将它们送至由指针 buf 所指示的缓冲区中;系统调用 write 的功能是试图把 n byte 个字节数据,从指针 buf 所指示的缓冲区中写到由 fd 所指向的文件中。


    (5) 连接和去连接(link 和 unlink)。

    为了实现文件共享,必须记住所有共享该文件的用户数目。为此,在该文件的索引结点中设置了一个连接计数 link。每当有一用户要共享某文件时,须利用系统调用 link 来建立该用户(进程)与此文件之间的连接,并对 i.link 做加 1操作。当用户不再使用此文件时,应利用系统调用 unlink 去断开此连接,亦即做 i.link 的减1 操作。当 i.link 减 1 后结果为 0 时,表示已无用户需要此文件,此时才能将该文件从文件系统中删除。故在 UNIX 系统中并无一条删除文件的系统调用。

     

     

    进程间的通信


    为了实现进程间的通信,在 UNIX 系统中提供了一个用于进程间通信的软件包,简称IPC。它由消息机制、共享存储器机制和信号量机制三部分组成。在每一种通信机制中,都提供了相应的系统调用供用户程序进行进程间的同步与通信之用。

    (1) 消息机制。

    用户(进程)在利用消息机制进行通信时,必须先利用 msgget 系统调用来建立一个消息队列。若成功,便返回消息队列描述符 msgid,以后用户便可利用 msgid 去访问该消息队列。用户(进程)可利用发送消息的系统调用 msgsend 向用户指定的消息队列发送消息;利用 msgrcv 系统调用从指定的消息队列中接收指定类型的消息。

    (2) 共享存储器机制。

    当用户(进程)要利用共享存储器机制进行通信时,必须先利用shmget 系统调用来建立一个共享存储区,若成功,便返回该共享存储区描述符 shmid。以后,用户便可利用 shmid 去访问该共享存储区。进程在建立了共享存储区之后,还必须再利用shmat 将该共享存储区连接到本进程的虚地址空间上。以后,在进程之间便可利用该共享存储区进行通信。当进程不再需要该共享存储区时,可利用 shmdt 系统调用来拆除进程与共享存储区间的连接。

    (3) 信号量机制。

    在 UNIX 系统中所采用的信号量机制,允许将一组信号量形成一个信号量集,并对这组信号量施以原子操作

     

     

    信息维护

     

    在 UNIX 系统中,设置了许多条用于系统维护的系统调用。


    (1) 设置和获得时间。

    超级用户可利用设置时间的系统调用(stime),来设置系统的日期和时间。如果调用进程并非超级用户,则 stime 失败。一般用户可利用获得时间的系统调用time 来获得当前的日期和时间。

    (2) 获得进程和子进程时间(times)。

    利用该系统调用可获得进程及其子进程所使用的CPU 时间,其中包括调用进程在用户空间执行指令所花费的时间,系统为调用进程所花费的 CPU 时间、子进程在用户空间所用的 CPU 时间、系统为各子进程所花费的 CPU 时间等,并可将这些时间填写到一个指定的缓冲区。

    (3) 设置文件访问和修改时间(utime)。

    该系统调用用于设置指名文件被访问和修改的时间。如果该系统调用的参数 times 为 NULL 时,文件主和对该文件具有写权限的用户,可将对该文件的访问和修改时间设置为当前时间;如果 times 不为 NULL,则把 times 解释为指向 utim buf 结构的指针,此时,文件主和超级用户能将访问时间和修改时间置入 utim buf结构中。

    (4) 获得当前 UNIX 系统的名称(uname)。

    利用该系统调用可将有关 UNIX 系统的信息存储在 utsname 结构中。 这些信息包括 UNIX 系统名称的字符串、系统在网络中的名称、 硬件的标准名称等。

     

     

    展开全文
  • 操作系统作业:给linux系统增加一个系统调用

    万次阅读 多人点赞 2018-06-01 00:43:37
    前不久开了一门《操作系统》,老师上课留下了一个作业——给Linux系统添加一个系统调用。刚开始只能用一脸懵逼来形容,只能硬着头皮做下去。由于刚的新电脑,所以就没敢装双系统。所以我选择了虚拟机,虚拟机刚开始...

     

         前不久开了一门《操作系统》,老师上课留下了一个作业——Linux系统添加一个系统调用。刚开始只能用一脸懵逼来形容,只能硬着头皮做下去。由于刚的新电脑,所以就没敢装双系统。所以我选择了虚拟机,虚拟机刚开始配置的过程不算特别复杂,网上也有很多教程,于是我看着虚拟机也是一脸懵逼,不知道从何下手,百度得知快捷键Ctr+Alt+T或者右键+终端可以打开终端,于是我试了一下,哇好眼熟,这不就是Windows系统里面那个黑框框吗(命令行);好像也是可以下手的,于是就这样一边百度一边做着,错了一次改下,改不动了推倒重新来过。终于最终解决了这个问题!

     

     

        下面部分主要分三个部分:一、系统调用的概念;二、实现系统调用的过程;三、实现过程遇到的问题;四、感受(ps:本人第一次写博客,可能前后内容不太连贯)

    ------------------------------------------------------------------------------------------------------------------------------------------------------ 

    一、系统调用的概念

            Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由操作系统核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。二者在使用方式上也有相似之处。Linux系统的核心部分即是Linux内核,是一系列设备的驱动程序。系统调用是Linux内核提供的功能十分强大的一系列的函数。这些函数是在内核中实现的,它们是应用程序和内核交互的接口,系统调用在Linux系统中发挥着巨大的作用,如果没有系统调用,那么应用程序就失去了内核的支持。

     

     二、系统调用的实现

    第一步:获取root权限(即管理员权限)

    在终端输入下列指令:

    sudo su

    注意:获取root权限需要用户输入密码(登陆密码),密码是看不见的,用户只需正确的输入密码即可,回车键结束

    示意图如下:

     

    第二步:准备工作

    1、安装相关编译程序

    sudo  apt-getinstallbuild-essentialkernel-package  libncurses5-dev

    2、获取内核

    (1)从外面将linux-4.16.10.tar拖入到了虚拟机桌面(我用的内核是linux-4.16.10)

        内核的话新版本也是可以的,官网下载或者从别人哪儿拷,指令的话只需要对应的把版本号改一下

    (2)下一步就是将该压缩文件移入到/usr/src/文件夹中

    注意:在.tar后面有一个空格,文件名建议复制不建议手敲。可以直接把我的语句复制过去然后方向键移到需要修改的地方进行修改

    sudo mv /peter/home/桌面/linux-4.16.10.tar/usr/src/

    注:由于我之前都将这些东西配置好了,所以是这个显示,一个细节,可以通过方向键的上下快速切换历史命令

     

    第三步、进入/usr/src解压文件

    cd /usr/src

    sudo tar -xvf /usr/src/linux-4.16.10.tar.bz2

    解压过程如下图所示,如果要确定自己的内核版本,可以在终端输入命令uname -r。解压过程稍长,注意:解压语句可能因为文件地址稍有不同,建议去计算机里面去拷贝路径!

     

    第四步:进入解压出的文件目录

    cd /usr/src/linux-4.16.10/kernel

     

    第五步:安装vim

    sudo apt-get install vim

     

     

    第六步:打开sys.c加入函数

    vim sys.c

     

    注意:在vim, i进入编辑, esc退出编辑状态. G跳到末尾, gg进入开头。 :wq保存退出, :q不保存退出)

     

    在末尾加入函数

    asmlinkage long sys_helloworld(void){

        printk( "helloworld!");

         return 1;

    }

     

    第七步、添加声明

    cd /usr/src/linux-4.16.10/arch/x86/include/asm/

    vim syscalls.h

    (插入asmlinkage long sys_helloworld(void);)

     

     

     

     

    第八步:加一个系统调用的id

    cd/usr/src/linux-4.16.10/arch/x86/entry/syscalls

    vim syscall_64.tbl

    a、进入/usr/src/linux-4.16.10/arch/x86/syscalls目录

    b、打开文件syscall_64.tbl(该文件有一个系统调用列表,最前面的属性是id

    c、在里面添加自己的系统调用号(333  64  helloworld           sys_helloworld

    d、使用esc +:wq命令保存退出

     

     

     

    注意:我在任务管理器发现我的VMware workstation是32位的,但我同学用64位成功了!所以我用的是vim syscall_64.tbl,之前试了vim syscall_32.tbl没能成功。所以要以虚拟机为主!!!

     

     

     

     

    第九步:配置内核

    cd  /usr/src/linux-4.16.10

    编译内核和安装内核.

    依次输入这四条语句

    sudo make mrproper

    sudo make clean

    sudo make menuconfig  并且在make

    nfig时,将那个General setup内的localversion修改成新的名称,比如我这里的myKernel

    sudo make menuconfig出现的问题:

    scripts/Makefile.lib:194: recipe for target 'scripts/kconfig/lexer.lex.c' failed make[1]:
    
    *** [scripts/kconfig/lexer.lex.c] Error 127 Makefile:552: recipe for target 'menuconfig' failed make: 
    
    *** [menuconfig] Error 2

     解决办法:

    sudo apt-get install bison
    sudo apt-get install flex

    安装这两个包完成后再sudo make menuconfig

     

     

    根据自己处理器的最大线程数目来编译.

    sudo make -j4 (我的电脑是44线程),线程越多编译越快!

    此处可能报错:

    make[1]:
    *** [scripts/sign-file] Error 1 
    Makefile:1065: recipe for target 'scripts' failed make: 
    *** [scripts] Error 2

     解决办法:

    第一反应耐心看报错信息,缺什么包补什么包sudo apt-get install XXXX

    下面这个语句可以解决较多的问题。

    sudo apt-get install libssl-dev

     

    编译过程真的超级超级漫长。。。

    注意: 这个时候,终端的窗口最好最大化,否则可能会报错。

     

    第十步:安装内核

    编译后安装内核到系统中.

    sudo makemodules_install  

    sudomake install  // 安装内核

    这个地方也需要一定的时间,反正编译三个多小时,不差这一会哈哈哈

     第十一步:重启虚拟机

    将之前的工作保存后直接重启,重启后点击鼠标进入ubuntu并且迅速按住shift,长按!我的虚拟机直接登陆上了,我同学的好像都有一个选择内核过程,有选择的话,只需要选择新核就OK了!

     

    第十二步:验证系统调用是否成功

    a、登陆虚拟机

    b、打开终端

    c、输入下列指令:

    (1)gcc hello.c

    输入下列代码:

     

    (2)./a.out

    输出,见证成果的时候到了!!!

    返回值为1!!!!!

    系统调用成功了!!!!

    终于弄完了,明天篮球场走起哈哈

     

    三、感受

        作为一个linux小白实现上述过程是很痛苦的,但是真的很想去把这件事做好,一步一步,从什么都不知道到好像懂了一点点,再到可以看懂每行代码的含义,到最后做出成果,刚开始做的时候比较浮躁,到了后面就冷静了。看了20多篇博客,解决各种问题;之前做的时候犯的错误多的数不胜数,后面弄的时候一点点规避和解决,功夫不负有心人,虽然为了这个作业花了我整整一周的精力(本人理解能力较差,周围有的大佬花了几天就弄完了),这次的成功相信可以给我后面进一步学好操作系统的信心,也培养了自己的耐心和攻坚精神。相信自己会继续加油的!

        给读者:排版方面,第一次用CSDN亲自写博客(之前都是看各路大牛的博客),格式没有弄得特别人性化,比如代码没能用特定的代码行来进行排版,但感觉应该不影响阅读,下次会继续改进的,希望下次还可以有东西可以写哈哈哈。如果有关于此篇博客的疑问,欢迎来撩!联系方式:QQ 2729707823 备注CSDN(有时候看见一个问题有人解决了但是没看懂,没办法联系博主就很难受!)

     空信最棒!

    更新于2019年5月7日晚。

     

     

     

     

     

     

     

     

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

    什么是系统调用?

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

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

    展开全文
  • 系统调用接口

    千次阅读 2018-11-27 09:53:59
    1、系统调用 操作系统作为系统软件,它的任务是为用户的应用程序提供良好的运行环境。因此,由操作系统内核提供一系列内核函数,通过一组称为系统调用的接口提供给用户使用。系统调用的作用是把应用程序的请求传递...

    1、系统调用

    操作系统作为系统软件,它的任务是为用户的应用程序提供良好的运行环境。因此,由操作系统内核提供一系列内核函数,通过一组称为系统调用的接口提供给用户使用。系统调用的作用是把应用程序的请求传递给系统内核,然后调用相应的内核函数完成所需的处理,最终将处理结果返回给应用程序。因此,系统调用是应用程序和系统内核之间的接口。Linux系统调用,包含了大部分常用的系统调用和由系统调用派生出的函数。

    系统调用接口是由一系列系统调用函数构成的特殊的接口。程序员或应用程序通过该特殊的接口取得操作系统内核所提供的服务,它是专为程序员编程时使用,是应用程序和系统内核通信的桥梁。也就是说,在应用程序中使用的系统调用是以函数的形式展现在用户面前,提供给用户使用。例如,用户可以通过和文件系统相关的系统调用,请求系统打开文件、关闭文件或读、写文件等。

    操作系统提供的各种服务之所以需要通过系统调用来提供给用户程序的根本原因是对系统进行保护。Linux运行空间分为内核空间与用户空间,它们各自运行在不同的级别上,逻辑上相互隔离。用户进程通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。但很多情况下,用户程序在执行过程中需要调用系统程序来获得相应的系统服务,这时就必须利用系统提供给用户的系统调用了。系统调用规定了用户进程进入内核的具体位置,即用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核,这样才能保证用户程序的执行不会威胁到内核的安全。

    2、Linux中的系统调用

    Linux系统利用系统调用进行内核与用户空间的通信,而且linux系统的系统调用相比其他的操作系统更加简洁和高效。总的来讲,系统调用在系统中主要用途如下:

    (1)控制硬件。例如,把用户程序的运行结果写入到文件中,可以利用write系统调用来实现,由于文件所在的介质必然是磁盘等硬件设备,所以该系统调用就是对硬件实施控制。

    (2)设置系统状态或读取内核数据。例如,用户程序可以通过time系统调用来读取属于内核数据的系统时钟。

    (3)进程管理。例如,用户程序可以利用fork系统调用来创建子进程,可以利用wait等系统调用来实现进程通信。

    3、API与系统调用的关系

    API(Application Programming Interface)又称为应用程序接口。通过该接口用户程序员可以间接的访问到系统硬件和操作系统资源。操作系统的主要作用之一就是把系统硬件和操作系统资源进行封装并对上层用户进行屏蔽,防止用户有意无意的对系统造成破坏。操作系统就像一个保护壳一样保护系统资源不被外界破坏。因此,当用户需要对系统资源进行访问的时候,就必须通过操作系统向用户提供的接口才能实现用户对系统资源的访问,取得内核的服务。

    API一般以函数定义的形式出现,如read()、malloc()、abs()等。但API并不需要和系统调用一一对应,它们之间的关系可以是一对一、一对多、多对一或者无关系。例如read()接口就和read系统调用对应,而abs()作用是求绝对值,不需要任何系统调用。而且一般API主要是通过C函数库来实现。
    --------------------- 
    作者:nail1991 
    来源:CSDN 
    原文:https://blog.csdn.net/nail1991/article/details/53151965 
    版权声明:本文为博主原创文章,转载请附上博文链接!

     

    总结:


    C标准库,系统调用,系统接口API,内核函数

    一、用户空间:

    1)C标准库:是适用于所有c语言编写的程序,没有平台差异性。

                      在用户空间程序员可以直接调用的。

                      用C语言和汇编语言实现的。

                      有的库函数封装了系统调用函数(调用库函数就可以间接调用系统调用)。

    2)系统API(以库的形式提供): 具有平台差异性,比如windows API 就不能在Linux平台上使用

                       它是操作系统提供给用户的接口,可以让用户直接使用操作系统的某个服务。

                      一个API可能调用了一个系统调用,也可能对应好几个系统调用。

    二、内核空间:

     1)系统调用:由内核提供给用户的接口,使用户可以对内核做操作。

                      但是需要进入内核态,才能调用。

    系统调用是用户进程进入内核的接口层,它本身并非内核函数,但他是由内核函数实现的,进入系统内核后,不同的系统调用会找到各自对应的内核函数,这写内核函数被称为系统调用的“服务例程”。也可以说系统调用是服务例程的封装例程。

    2)内核函数:实现内核功能的函数

    展开全文
  • 【Linux系统编程】Linux系统调用

    千次阅读 多人点赞 2019-09-22 20:52:34
    用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 ...
  • 在计算机中,系统调用(英语:system call),又称为系统呼叫,指运行在使用者空间的程序向 操作系统内核请求需要更高权限运行的服务。系统调用提供了用户程序与操作系统之间的接口( 即系统调用是用户程序和内核...
  • 系统调用(操作系统6)

    千次阅读 2020-10-03 16:27:24
    - 系统调用的作用 - 系统调用与库函数的区别 - 系统调用背后的过程
  • 系统调用和函数调用区别

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

    千次阅读 2015-11-24 13:42:25
    系统调用和函数调用1. 系统调用a. 什么是系统调用系统调用,通俗的讲,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件...
  • 系统调用知识框架图2.系统调用和库函数的区别3.系统调用的执行过程 1.系统调用知识框架图 2.系统调用和库函数的区别 3.系统调用的执行过程 参考:《2021王道操作系统考研》 bilibili : ...
  • Linux系统调用

    千次阅读 2018-03-19 13:19:45
    1 概述相比Intel支持的快速系统调用指令sysenter/sysexit,AMD对应的是syscall/sysret,不过现在,Intel也兼容这两条指令。 测试环境:Ubuntu 12.04Ubuntu 16.04 642 传统系统调用int 0x80只用于32位系统,64位...
  • 系统调用和函数调用的区别

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

    千次阅读 2018-10-26 21:21:12
    系统调用:操作系统的接口是连接应用软件与操作系统的中间桥梁。接口在程序设计中表现的形式就是:函数。操作系统提供的函数就被称为系统调用(system call)。这里有个标准POSIX(Portable Operating System ...
  • 系统调用poll机制分析(非常透彻)

    万次阅读 2020-03-25 20:37:52
    rt-thread其实很多代码都是参考Linux的架构,或者运用的是Linux的设计思想,poll系统调用是经常使用到的系统调用,本次博客来分析poll在rtt(以下没有特殊说明,就把rt-thread简称为rtt)中的实现方法,如果了解了...
  • Linux系统添加系统调用

    千次阅读 2018-05-23 12:37:14
    参考链接:Ubuntu 16.10添加系统调用点击打开链接
  • 系统调用与库函数调用

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

    千次阅读 2018-07-05 09:37:14
    系统调用是操作系统提供的有效服务界面,一般使用高级语言编写,如c和c++,对于特定的较为底层的任务,则使用汇编语言指令。 2. API和系统调用 API,应用程序接口,提供应用程序与开发人员基于某软件或硬件的以...
  • 系统调用和库函数调用的区别

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

    千次阅读 2019-11-24 10:48:33
    系统调用与普通过程调用的异同点系统调用与普通过程调用的异同点 系统调用与普通过程调用的异同点 相同点: 改变指令流程 重复执行和公用 改变指令流程后需要返回原处 不同点: 系统调用是动态调用,而CALL调用方式...
  • 系统调用是什么

    千次阅读 2018-08-09 11:12:17
    系统调用 1.系统调用和普通函数完全不同,系统调用实际上是0x80号中断对应的中断处理程序的子程序。换句话说,在linux系统上,0x80中断是系统调用的统一入口。某个具体的系统调用是这个中断处理程序的子程序,进入...
  • 浅谈C语言函数调用与系统调用

    千次阅读 2019-11-12 09:55:50
    1. 函数调用和系统调用概述 1.1 定性的去区分函数调用和系统调用 很多初学C语言的同学,亦或者开发中很少接触系统底层的同学可能会认为函数调用以及系统调用是一回事。因为在应用程序,两者都被抽象成接口去给应用...
  • 系统调用实现

    千次阅读 2016-01-20 11:51:20
    当用户态的进程调用一个系统调用时,CPU从用户态切换到内核态并开始执行一个内核函数。Linux通过由向量为128(0x80)的编程异常实现CPU由用户态到内核态的转换。 因为内核实现了许多不同的系统调用,为了区别他们,...
  • 系统调用、函数调用

    千次阅读 2015-04-16 08:43:23
    1、系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 221,008
精华内容 88,403
关键字:

系统调用