#import "../template.typ": *
#pagebreak()
= 可执行文件和加载

== 可执行文件

=== 什么是可执行文件？

学习操作系统前: 那个 “双击可以弹出窗口的东西”

学习操作系统后:

- 一个操作系统中的对象 (文件)
- 一个字节序列 (我们可以把它当文本编辑)
- 一个描述了状态机初始状态的数据结构
  - 哦，打扰了

=== 作为 “数据结构” 的可执行文件

状态机初始状态的描述

- 内存中的各段的位置和权限
- 初始的 PC 在 ELF Header 的 entry
- 寄存器和栈由操作系统决定
  - 上节课的 env.c

状态迁移的描述: 代码

RTFM: #link("https://jyywiki.cn/pages/OS/manuals/sysv-abi.pdf")[ System V ABI ]

- binutils 中的工具可以让我们查看其中的重要信息
- ChatGPT 可以帮我们解释不明白的概念

=== 加载最小可执行文件

最小可执行文件

- 代码在内存中
- PC 指向第一条指令
- 除此之外，任何初始状态都行

直接把代码 mmap 到内存

- 然后跳转过去即可
- (你可以想象 execve 里就做了这件事)
