操作系统上的应用程序

操作系统上的应用程序

2025 南京大学《操作系统原理》
操作系统上的应用程序

我们感受到的 “操作系统”

作为用户,我们是感受不到操作系统的

  • 我们只能感受到操作系统上运行的程序 (进程)

center

2025 南京大学《操作系统原理》
操作系统上的应用程序

能直接看到的程序:Applications

开发

  • 集成开发环境 Vscode, Cursor, ...
  • 编程工具 gcc, clang, nodejs, gdb, ...
  • 终端工具 tmux, vim, htop, ...

日用

  • 办公 LibreOffice, GIMP, ...
  • 浏览器 Chrome, Firefox, ...
  • 媒体 OBS, VLC, ...
2025 南京大学《操作系统原理》
操作系统上的应用程序

能直接看到的 (幕后) 程序:Utilities

Core Utilities (coreutils)

系统/工具程序:无所不能

  • Shell, binutils, ...
  • 包管理 apt, dpkg, ...
  • 网络 ip, ssh, curl, ...
  • 多媒体 ffmpeg (真神 1), gstreamer (真神 2), ...
2025 南京大学《操作系统原理》
操作系统上的应用程序

不能直接看到的:各种后台程序

“守护进程” daemon

  • 万物归宗 systemd
    • systemd-network, systemd-logind, systemd-udevd, ...
  • 系统管理 cron, udiskd, unattended-upgrade (讨厌), ...
  • 各类服务 httpd, sshd, ...
  • 安全组件 auditd, firewalld, ...
  • 用户服务 pulseaudio, dbus-daemon, ...

图形与媒体

  • Wayland compositor; xfce4, lxde, ...
  • Pulseaudio, pipewire, video4linux, ...
2025 南京大学《操作系统原理》
操作系统上的应用程序

所以所有这一切的程序……

和 minimal.S 有任何区别吗?

  • 简短的答案:没有
  • 任何程序 = minimal.S = 状态机

可执行文件是操作系统中的对象

  • 与 minimal 的二进制文件没有本质区别
  • 让我们在命令行里看看上面那些 “程序” 都是什么
    • 如果你是第一次接触命令行……也不用怕
    • 问问大语言模型吧:我有一个 a.out 文件,我如何探索它里面有什么?
2025 南京大学《操作系统原理》
操作系统上的应用程序

我的第一次二进制逆向 (~2000)

Curiosity is all you need

  • (Attention is all an LLM needs.)
  • 我们也可以 hack binary——它们也就是字节序列

center

2025 南京大学《操作系统原理》
操作系统上的应用程序

死去记忆的意义

Curiosity is all you need: 我发现我的游戏存档,是用二进制 00 01 02 来标记的;所以我这样就解锁所有进度了!太酷了!但如果我想修改其他更复杂的程序和文件,有什么好工具呢?

如果那时候有人告诉我……

  • 同样的方式也可以去 hack Windows binary
  • Binary 太复杂?用正确的工具把 “不在意” 的部分屏蔽掉
    • 就入门了逆向工程

Computer Science 是无门槛复制工具的人造科学

  • 在 AI 的辅助下,你与 “顶尖人类” 的差距可以很小
2025 南京大学《操作系统原理》
操作系统上的应用程序

正确的工具

打开程序的执行:Trace (追踪)

In general, trace refers to the process of following anything from the beginning to the end. For example, the traceroute command follows each of the network hops as your computer connects to another computer.

System call trace (strace)

  • “理解程序是如何与操作系统交互的”
    • (观测状态机执行里的 syscalls)
    • Demo: 试一试最小的 Hello World
2025 南京大学《操作系统原理》
操作系统上的应用程序

操作系统中的 “任何程序”

任何程序 = minimal.S = 状态机

  • 总是从被操作系统加载开始
    • 通过另一个进程执行 execve 设置为初始状态
  • 经历状态机执行 (计算 + syscalls)
    • 进程管理:fork, execve, exit, ...
    • 文件/设备管理:open, close, read, write, ...
    • 存储管理:mmap, brk, ...
  • 最终调用 _exit (exit_group) 退出

感到吃惊?

  • 浏览器、游戏、杀毒软件、病毒呢?都是这些 API 吗?
2025 南京大学《操作系统原理》
操作系统上的应用程序

自己动手做实验:观察程序的执行

工具程序代表:编译器 (gcc)

  • strace -f gcc a.c (gcc 会启动其他进程)
    • 可以管道给编辑器 vim - (vscode 也可以)
    • 编辑器里还可以 %!grep
      • 对于开发者来说,工具的组合是非常重要的

图形界面程序代表:编辑器 (xedit)

  • strace xedit
    • 图形界面程序和 X-Window 服务器按照 X11 协议通信
    • 虚拟机中的 xedit 将 X11 命令通过 ssh (X11 forwarding) 转发到 Host
2025 南京大学《操作系统原理》
操作系统上的应用程序

想象 “一切应用程序” 的实现

应用程序 = 计算 + 操作系统 API

  • 窗口管理器
    • 能直接管理屏幕设备 (read/write/mmap)
      • 能画一个点,理论上就能画任何东西
    • 能够和其他进程通信 (send, recv)
  • 任务管理器
    • 能访问操作系统提供的进程对象 (readdir)
  • 杀毒软件
    • 文件静态扫描 (read)、主动防御 (ptrace)

操作系统的职责:提供令应用程序舒适的抽象 (对象 + API)

2025 南京大学《操作系统原理》