操作系统中的系统调用(Opera系统):什么是、类型和示例

⚡ 智能摘要

系统调用是进程用来请求内核服务(例如文件访问、进程控制和设备通信)的受控接口,它能安全地将 CPU 从用户模式切换到特权内核模式。

  • ???? 定义: 这是用户程序访问操作系统服务的唯一入口点。
  • 🔄 如何使用: 该进程陷入内核,内核运行请求并返回用户模式。
  • 🗂️ 类型: 过程控制、文件、设备、信息维护和通信。
  • ⚙️ 例子: fork()、exec()、wait()、exit()、open()、read() 和 write()。
  • 🤖 人工智能视角: 机器学习扫描系统调用 trac用于检测入侵;Copilot 加快系统调用编码速度。

系统调用 Opera系统

什么是系统调用 Opera系统?

A 系统调用 是一种提供进程与操作系统之间接口的机制。它是一种编程方法,计算机程序通过该方法向操作系统内核请求服务。

系统调用通过API(应用程序编程接口)向用户程序提供操作系统的服务。系统调用是内核系统的唯一入口点。

系统调用 Opera系统

系统调用 Opera系统

系统调用示例

例如,要编写一个从一个文件中读取数据并将其复制到另一个文件中的程序,该程序首先需要两个文件的名称:输入文件和输出文件。

在交互式系统中,这种类型的程序执行需要操作系统进行一些系统调用。

  • 第一个调用是在屏幕上写入提示信息。
  • 第二种方法是从键盘读取定义这两个文件的字符。

系统调用如何工作?

以下是操作系统中系统调用的步骤:

系统调用工作原理

Archi系统调用的结构

Archi系统调用的结构

如上图所示:

步骤1) 这些进程以用户模式执行,直到被系统调用中断为止。

步骤2) 之后,系统调用将按优先级在内核模式下执行。

步骤3) 系统调用执行完毕后,控制权返回用户模式。

步骤4) 用户进程的执行恢复,在用户模式和 内核模式 按要求。

为什么操作系统需要系统调用?

以下情况需要在操作系统中调用系统调用:

  • 读取和写入文件需要系统调用。
  • 如果文件系统想要创建或者删除文件,就需要系统调用。
  • 系统调用用于创建和管理新进程。
  • 网络连接需要系统调用来发送和接收数据包。
  • 访问扫描仪或打印机等硬件设备需要系统调用。

系统调用类型

以下是操作系统中的五种系统调用类型:

  • 过程控制
  • 文件管理
  • 设备管理
  • 信息维护
  • 外场通讯

系统调用的类型

操作系统中的系统调用类型

过程控制

这些系统调用执行进程创建、进程终止等任务。

功能:

  • 结束并中止
  • 加载并执行
  • 创建进程和终止进程
  • 等待 Signal 创建
  • 分配和释放内存

文件管理

文件管理系统调用处理文件操作工作,如创建文件,读取和写入等。

功能:

  • 建立档案
  • 删除文件
  • 打开和关闭文件
  • 读取、写入和重新定位
  • 获取和设置文件属性

设备管理

设备管理负责执行设备操作工作,例如从设备缓冲区读取、写入设备缓冲区等。

功能:

  • 请求和释放设备
  • 逻辑上连接或断开设备
  • 获取和设置设备属性

信息维护

它处理操作系统和用户程序之间的信息及其传输。

功能:

  • 获取或设置时间和日期
  • 获取进程和设备属性

外场通讯

这类系统调用专门用于进程间通信。

功能:

  • 创建和删除通信连接
  • 发送和接收消息
  • 帮助操作系统传输状态信息
  • 连接或断开远程设备

系统调用参数传递规则

以下是向系统调用传递参数的一般规则:

  • 参数应该由操作系统压入或弹出堆栈。
  • 参数可以通过寄存器传递。
  • 当参数数量多于寄存器数量时,应将它们存储在一个块中,并将块地址通过寄存器传递。

操作系统中使用的重要系统调用

等待()

在某些系统中,一个进程必须等待另一个进程完成。这种情况发生在父进程创建子进程时,父进程会一直处于挂起状态,直到子进程完成。

父进程的挂起是通过 wait() 系统调用自动实现的。当子进程结束执行时,控制权会返回给父进程。

叉子()

进程使用此系统调用来创建自身的副本进程。借助 fork() 函数,父进程创建一个子进程,父进程会被挂起,直到子进程执行完毕。

exec()

该系统调用会在已运行的进程中执行一个可执行文件,替换原有的文件。由于没有创建新进程,因此原始进程标识符保持不变,但堆栈、数据、堆等都会被新进程替换。

杀()

kill() 系统调用是操作系统用来向进程发送终止信号,促使其退出的。然而,kill() 系统调用并不一定意味着真正杀死进程,它可能有多种不同的含义。

出口()

exit() 系统调用用于终止程序执行。尤其是在多线程环境下,此调用表示线程执行已完成。exit() 调用后,操作系统会回收进程使用的资源。

常见问题

API 是一组应用程序调用的函数。系统调用是进入内核的底层请求。

库函数在用户空间运行;系统调用则进入内核。像 fopen() 这样的调用通常会在内部调用 open()。

不。printf() 是一个 C 语言库函数,用于格式化和缓存文本。它仅在缓冲区刷新时才会调用 write() 函数。

用户模式限制对硬件和内存的访问;内核模式拥有完全权限。系统调用可以在两者之间安全切换。

Windows 使用 CreateProcess()、ReadFile() 和 WriteFile() 函数。Linux 使用 fork()、read() 和 write() 函数。两者都涵盖进程、文件、设备和通信服务。

是的。系统调用会切换到内核模式,增加系统开销。普通函数调用则留在用户空间,运行速度更快。

安全工具将机器学习应用于系统调用 traces,可以标记出签名扫描器经常遗漏的恶意软件和入侵。

是的。GitHub Copilot 可以为 fork()、read() 和 write() 等调用提供语法建议。但开发者仍然需要验证错误处理机制。

总结一下这篇文章: