操作系统中的任何程序

任何程序 = minimal.S = 调用 syscall 的状态机

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

  • 与大家日常使用的文件 (a.c, README.txt) 没有本质区别
  • 操作系统提供 API 打开、读取、改写 (都需要相应的权限)

查看可执行文件

  • vim, cat, xxd 都可以直接 “查看” 可执行文件
    • vim 中二进制的部分无法 “阅读”,但可以看到字符串常量
    • 使用 xxd 可以看到文件以 "\x7f" "ELF" 开头
    • Vscode 有 binary editor 插件

系统中常见的应用程序

Core Utilities (coreutils)

  • Standard programs for text and file manipulation
  • 系统中安装的是 GNU Coreutils

系统/工具程序

  • bash, binutils, apt, ip, ssh, vim, tmux, jdk, python, ...
    • 这些工具的原理不复杂 (例如 apt 是 dpkg 的套壳),但琐碎
    • Ubuntu Packages (和 apt-file 工具) 支持文件名检索

其他各种应用程序

  • Vscode, 浏览器、音乐播放器……

打开程序的执行: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.

这门课中很重要的工具:strace

  • System call trace
  • 允许我们观测状态机的执行过程
    • Demo: 试一试最小的 Hello World
    • 在这门课中,你能理解 strace 的输出并在你自己的操作系统里实现相当一部分系统调用 (mmap, execve, ...)

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

任何程序 = minimal.S = 调用 syscall 的状态机

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

(初学者对这一点会感到有一点惊讶)

  • 说好的浏览器、游戏、杀毒软件、病毒呢?都是这些 API 吗?
  • 我们有 strace,就可以自己做实验了!

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

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

  • 主要的系统调用:execve, read, write
  • strace -f gcc a.c (gcc 会启动其他进程)
    • 可以管道给编辑器 vim -
    • 编辑器里还可以 %!grep (细节/技巧)

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

  • 主要的系统调用:poll, recvmsg, writev
  • strace xedit
    • 图形界面程序和 X-Window 服务器按照 X11 协议通信
    • 虚拟机中的 xedit 将 X11 命令通过 ssh (X11 forwarding) 转发到 Host

各式各样的应用程序

都在操作系统 API (syscall) 和操作系统中的对象上构建

  • 窗口管理器
    • 管理设备和屏幕 (read/write/mmap)
    • 进程间通信 (send, recv)

  • 任务管理器
    • 访问操作系统提供的进程对象 (readdir/read)
    • 参考 gdb 里的 info proc *

  • 杀毒软件
    • 文件静态扫描 (read)
    • 主动防御 (ptrace)
    • 其他更复杂的安全机制……