Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • 操作系统

    • 学习笔记

      • 鸟哥的Linux私房菜学习笔记01-计算机概论
      • 鸟哥的Linux私房菜学习笔记02-磁盘分区
      • 鸟哥的Linux私房菜学习笔记03-日志文件
      • 寄存器
      • 汇编语言
      • 零拷贝
      • 内存管理单元MMU
      • 内存管理基础知识
      • 文件系统
      • 系统调用
        • 写时复制
        • 虚拟地址
        • 虚拟内存
        • 中断
        • CPU
        • DMA
        • mmap
        • Swap分区
      • Shell

      • Linux命令

      • RAID分类详解
      • Page Cache与Page回写
      • 磁盘IO与swap分区
    • 计算机网络

    • 数据结构和算法

    • MySQL

    • Redis

    • Nginx

    • MongoDB

    • 其他

    • 计算机基础
    • 操作系统
    • 学习笔记
    Ravior
    2019-02-05
    目录

    系统调用

    IO

    用户进程工作在用户态,它是受限的,很多涉及到硬件的操作都无法执行,但是它们又想要取得结果,就只能请求工作在内核态的操作系统帮助完成这些操作,并将操作结果交给用户进程。

    系统调用(system call)就是操作系统提供给用户进程请求操作系统做一些特权操作的接口,即为用户进程提供服务的窗口。在Linux下可以通过man syscalls命令查看Linux提供的所有系统调用。

    IO

    理解系统调用其实很简单,比如有一个程序想要读取a.log文件(例如head -n 1 a.log),读取之前必须先打开文件,但是用户进程是没有权限打开文件的,所以用户进程只能发送一个open()的系统调用请求操作系统去帮忙打开这个文件,操作系统打开这个文件后会将打开的结果——文件描述符交给用户进程,用户进程通过这个文件描述符就能去操作这个文件。

    再进一步,用户进程想要从这个打开的文件中读取一行数据,用户进程是没有权限读取文件的,只能发送一个read()系统调用请求操作系统去读取这一行数据,操作系统读取这行数据后就能交给用户进程。

    不难发现,系统调用open()和read()都像是函数。其实它们确实都是函数,只不过是比较特殊的由操作系统提供的,一般是由汇编语言编写或参杂了部分汇编代码,因为它们要和硬件交互。

    C库包含了所有和系统调用同名的库函数,或者说,这些库函数是对系统调用的封装,执行这些库函数是对系统调用的封装,执行这些库函数时,会发起封装在其内的同名系统调用的请求。例如,C库有open()库函数,它用来打开文件,但是C程序工作在用户模式下,是没有权限打开文件的,于是在执行到open()函数时,open()库函数会发起一个同名的open()系统调用请求操作系统打开文件,同理read()库函数和read()系统调用的关系也是一样的。

    对于非C程序,其实本质还是一样的。比如CPython,也有open()函数,它是对C库函数open()的再次封装。所以,在Python程序中调用open()方法打开文件,其实是调用C库的open()函数,再通过open()库函数发起系统调用请求操作系统打开文件,并将结果交给Python程序。

    最后,结合前面介绍的中断概念,描述下发起系统调用后的主要过程:

    • 发起系统调用,请求操作系统帮忙执行某些操作,这会产生软中断;
    • 软中断导致陷入内核,CPU控制权交给操作系统,操作系统处理中断,即执行被请求的操作;
    • 如果一切正常,操作系统在完成操作后会恢复到断点处继续向下执行,这会回到用户态;
    • 用户进程取得操作系统操作的成果,继续向下执行。

    # 系统调用表

    #操作系统
    上次更新: 2022/12/01, 11:09:34
    文件系统
    写时复制

    ← 文件系统 写时复制→

    最近更新
    01
    常用游戏反外挂技术总结
    11-27
    02
    Golang开发实践万字总结
    11-11
    03
    Redis万字总结
    10-30
    更多文章>
    Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式