系统调用的类别是什么?如何继续?效果如何?

系统调用的类别是什么?如何继续?效果如何?
系统调用的类别是什么?如何继续?效果如何?
目录
[导言]...1
[概述] 1
[系统调用的类别]...2
[安全模式]...2
[库应用编程接口]...3
[示例和工具]...4
[典型实施模式]...4
[处理器模式和上下文切换]...6
[摘要]...6
[参考资源]...6
【介绍】一个朋友要求学习系统调用的知识。让我们通过这篇文章找到答案。
[概述]在计算机中,系统调用(通常缩写为syscall)是计算机程序从操作系统内核请求服务的一种编程方式。这可能包括硬件相关服务(如访问硬盘)、创建和执行新进程,以及与内核服务通信(如进程调度)。系统调用提供了进程和操作系统之间的重要接口。
在大多数系统中,系统调用只能由用户空之间的进程进行,而在某些系统中,如os/360及其后继系统,特权系统代码也可以发出系统调用。
[系统调用的类别]
系统调用可以大致分为六类:
1.过程控制
a.创建流程
b.过程的终止
c.加载和执行
d.获取/设置流程属性
e.等待时间、等待事件和信号事件
f.分配和释放内存
2.资料管理
a.创建和删除文档
b.打开文件并关闭文件
c.阅读、书写和调整最好看的玄幻小说位置
d.获取/设置文件属性
3.设备管理
a.请求设置装置和释放设置装置
b.读、写并调整位置
c.获取/设置设备属性
d.连接或断开设备
4.信息维护
a.获取/设置时间或日期
b.获取/设置系统数据
c.获取/设置进程、文件或设备属性
5.沟通
a.建立和断开通信
b.发送和接收信息
c.转移状态信息
d.连接和断开远程设备
6.保护措施
a.获取/设置文件权限
[安全模式]
除了一些嵌入式系统,大多数现代处理器架构都包含安全模型。例如,环形模型指定了软件可以执行的多个权限级别:一个程序通常被限制在其自己的地址空,因此它不能访问或修改其他正在运行的程序或操作系统本身,并且通常被阻止直接操作硬件设备(如帧缓冲器或网络设备)。
然而,在许多情况下,许多应用程序需要访问这些组件来完成它们自己的任务,因此操作系统提供系统调用来为这些操作提供定义良好且安全的通信方法。
操作系统以最高级别的权限执行,允许应用程序通过系统调用请求使用服务,系统调用通常由中断启动。中断会自动将中央处理器提升到某个较高的特权级别,然后将控制权交给内核,由内核决定调用程序是否应该被授予所请求的服务。
如果请求的服务被允许,内核将执行一组特定的指令来完成任务。但是,调用者对内核没有直接的控制权,在任务完成后将控制权返回给调用者。
[库应用编程接口]
一般来说,系统环境将提供一个库来公开一些api,这些api可以完成应用程序和操作系统之间的通信任务。
在类似unix的系统中,这些apis通常是c库库(libc)实现的一部分,例如glibc,它为系统调用提供封装的函数,通常与系统调用同名。
在视窗操作系统上,这个应用编程接口是本地应用编程接口的一部分,在ntdll.dll图书馆;这是一个未发布的应用编程接口,由传统的窗口应用编程接口的实现使用,并直接由一些系统程序在窗口上使用。该库的封装功能层公开了一个通用的函数调用约定(汇编级子例程调用),用于使用系统调用并使系统调用更加模块化。
在这里,封装层的主要功能是将所有要传递给系统调用的参数放在相应的处理器寄存器中(有时在调用堆栈中),并为内核调用设置一个唯一的系统调用号。这样,操作系统和应用程序之间的库增加了可移植性。
对库函数本身的调用不会导致切换到内核模式,它通常是一个普通的子例程调用(例如,它在一些指令集体系结构中使用)。呼叫& # 34;装配说明)。
实际的系统调用确实将控制权转移给了内核(这比抽象库调用更依赖于具体的实现和平台环境)。例如,在类似unix的系统中,fork和exec是c库函数,它们依次调用系统调用的指令,如fork和exec。
直接在应用程序代码中进行系统调用比较复杂,可能需要使用嵌入式汇编代码(在c和c++中),并且需要知道系统调用操作的底层二进制接口。这些二进制接口可能随时间而变化,它们不是应用程序二进制接口的一部分,库函数的功能是为抽象这些逻辑而创建的。
在基于外内核的系统中,图书馆作为中介的作用尤为重要。在外内核上,该库在非常低级的内核应用编程接口中屏蔽用户应用程序,并提供抽象层和资源管理。
ibm操作系统源于os/360和dos/360,包括z/os和z/vse,都通过汇编语言宏库实现系统调用。它们起源于汇编语言编程比高级语言更普遍的时代。因此,ibm的系统调用不能由高级语言程序直接调用,而是需要一个封装的可调用汇编语言子程序。
[系统中的示例和检测工具]
在unix、类unix和其他posix兼容的操作系统上,常用的系统调用是打开、读取、写入、关闭、等待、执行、交换、分叉、退出和终止。许多现代操作系统有数百个系统调用。例如,linux和openbsd各有300多个不同的调用,netbsd有近500个调用,freebsd有500多个调用,windows 7有近700个调用,plan 9有51个调用。
一些工具,如strace,ftrace,truss等。,可以跟踪和报告从进程开始时由该进程调用的所有系统调用,或者将这些工具附加到已经运行的进程以跟踪其进程调用。只要跟踪操作不违反用户的权限,进程发出的任何系统调用都可以被拦截。这些程序工具的这种特殊能力通常是通过系统调用来实现的,例如,strace是通过系统骨子无错版调用ptrace或procfs中的文件来实现的。
[典型实施模式]
为了实现系统调用,有必要将控制权从用户空转移到内核空上,这涉及到一些特定的架构特性。典型的实现是使用软件中断。中断将控制权从用户程序转移到操作系统内核,因此软件只需要设置一些带有系统调用号的寄存器,并通过触发这些寄存器内容的改变来执行软件中断。
软中断是许多risc处理器上唯一可用的系统调用技术,但cisc体系结构(如x86)也支持其他技术。
例如,x86指令集包含syscall/sysret和sysenter/sysente指令(这两种机制是由amd和英特尔独立创建的,但它们的功能基本相同)。
这些指令集都是为& # 34;快速& # 34;控制转移指令的目的是在不中断的情况下将系统调用的控制权快速转移到内核。
linux版开始在x86上使用这项技术。过去,它使用interrupt (int)指令。这时,系统调用号0x80首先被写入eax寄存器,然后中断被触发。
一种较老的系统调用机制是调用门。最初,它用于多播,后来用于英特尔x86。
它允许程序直接使用操作系统设置的安全控制转移机制来调用内核函数。这种方法在x86上不受欢迎,可能是因为需要使用x86内存分段进行远程调用,从而导致缺乏可移植性。x86上有一个更快的方法。
ia-64架构采用epc(输入特权代码)指令。前8个系统调用参数在寄存器中传递,其余的在堆栈中传递。
在ibm自己的大多数操作系统中,例如ibm的system/360大型机系列及其后继产品,对遗留设备的系统调用是在linux的所有系统调用指令中实现的。
值得注意的是,在ibm的system/360大型机系列及其后继产品中,有一个supervisor call指令,其编号在指令中而不是在寄存器中,它实现了对遗留设备的系统调用。
在ibm自己的操作系统中,程序调用指令用于更新的设备。特别是,当呼叫者处于srb模式时,将使用程序调用(pc)。
[处理器模式和上下文切换]
在大多数类似unix的系统中,系统调用是在内核模式下处理的,内核模式是通过将处理器的执行模式更改为更特权的模式来实现的,但是不需要切换进程上下文——尽管特权上下文切换确实会发生。硬件根据处理器状态寄存器的执行模式来观察环境,而进程是操作系统提供的一个抽象概念。通常,系统调用不需要切换另一个进程的上下文;相反,无论哪个进程调用它,它都将在该进程的上下文中被处理。
在多线程进程中,系统调用可以由多个线程完成。此类调用的处理取决于特定操作系统内核和应用程序运行时环境的设计。以下是操作系统遵循的典型模式列表:
多对一模型。进程中来自任何用户线程的所有系统调用都由内核级线程处理。这种模式有一个严重的缺点——任何被阻塞的系统调用(比如等待用户输入)都会冻结所有其他线程。此外,因为一次只有一个线程可以访问内核,所以这种模式不能使用具有多个内核的处理器。
一对一模式。在系统调用期间,每个用户线程都将连接到一个独立的内核级线程。这种模式解决了上述阻塞系统调用的问题。它已经在所有主要的linux发行版、苹果操作系统、ios、最新的视窗和solaris版本中得到应用。
多对多模式。在这个模型中,用户线程池被映射到内核线程池。来自用户线程池的所有系统调用都由相应内核线程池中的线程处理。
*混合模式。这种模式结合了多对多和一对一模式,最终取决于内核的选择。这在irix、惠普-ux和solaris的旧版本中很常见。
[摘要]
本文对系统调用进行了讨论和研究。一般来说,所有需要资源的程序都必须通过系统调用才能完成任务,希望对每个人都有好处。
读者和朋友可以通过以下方式向丁格凯提问:
微信,微信公众号,站b,今天的头条,youtube。
文章来源:www.atolchina.com