复习:操作系统
本次课回答的问题
本次课主要内容
数字逻辑电路
例子:
$$X' = \neg X \land Y$$ $$Y' = \neg X \land \neg Y$$
#define REGS_FOREACH(_) _(X) _(Y)
#define RUN_LOGIC X1 = !X && Y; \
Y1 = !X && !Y;
#define DEFINE(X) static int X, X##1;
#define UPDATE(X) X = X##1;
#define PRINT(X) printf(#X " = %d; ", X);
int main() {
REGS_FOREACH(DEFINE);
while (1) { // clock
RUN_LOGIC;
REGS_FOREACH(PRINT);
REGS_FOREACH(UPDATE);
putchar('\n'); sleep(1);
}
}
输出数码管的配置信号
你还体验了 UNIX 哲学
Hmm....
你需要《程序设计语言的形式语义》
C 程序的状态机模型 (语义,semantics)
应用:将任何递归程序就地转为非递归
call()
,但放入不同的 Frame
还是状态机
操作系统上的程序
trap
指令)调用操作系统
程序 = 计算 + syscall
int main() {
printf("Hello, World\n");
}
gcc 编译出来的文件不满足 “最小”
--verbose
可以查看所有编译选项 (真不少)-static
会复制 libc强行编译 + 链接:gcc -c
+ ld
_start
避免警告)问题:为什么会 Segmentation Fault?
starti
可以帮助我们从第一条指令开始执行程序layout
)有办法让状态机 “停下来” 吗?
解决办法:
#include <sys/syscall.h>
int main() {
syscall(SYS_exit, 42);
}
movq $SYS_exit, %rax # exit(
movq $1, %rdi # status=1
syscall # );
Note: gcc 支持对汇编代码的预编译 (还会定义 __ASSEMBLER__
宏)
我是从哪里获得这些黑科技代码的???
回顾:状态机视角的程序
为什么 Hello World 有颜色??
特殊编码的字符实现终端控制
telnet towel.blinkenlights.nl
(电影;Ctrl-] and q 退出)dialog --msgbox 'Hello, OS World!' 8 32
ssh sshtron.zachlatta.com
(网络游戏)“状态机” 顺便解决了一个非常重要的基本问题:
什么是编译器???
编译器:源代码 $S$ (状态机) → 二进制代码 $C$ (状态机) $$C = \textrm{compile}(S)$$
编译 (优化) 的正确性 (Soundness):
在保证观测一致性 (sound) 的前提下改写代码 (rewriting)
asm volatile
这给了我们很多想象的空间
PL 领域 (的很多人) 有一种倾向:用数学化的语言定义和理解一切 (all about semantics)
Further readings
可执行文件
查看可执行文件
vim
, cat
, xxd
都可以直接查看可执行文件vim
中二进制的部分无法 “阅读”,但可以看到字符串常量xxd
可以看到文件以 "\x7f" "ELF"
开头Core Utilities (coreutils)
系统/工具程序
SDL2/SDL.h
时...其他各种应用程序
杀人的面试题 (1):一个普通的、人畜无害的 Hello World C 程序执行的第一条指令在哪里?
等价问法
main
的第一条指令 ❌libc
的 _start
❌问 gdb 吧
info proc {mappings,...}
- 打印进程内存main()
之前发生了什么?ld-linux-x86-64.so
加载了 libc
main()
的开始/结束并不是整个程序的开始/结束谁规定是 ld-linux-x86-64.so
,而不是 rtfm.so
?
gcc --verbose
杀人的面试题 (2):main 执行之前、执行中、执行后,发生了哪些操作系统 API 调用?
呃……
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 ./hello-goodbye
程序 = 状态机 = 计算 → syscall → 计算 →
(初学者对这一点会感到有一点惊讶)
编译器 (gcc),代表其他工具程序
strace -f gcc a.c
(gcc 会启动其他进程)vim -
%!grep
(细节/技巧)图形界面程序 (xedit),代表其他图形界面程序 (例如 vscode)
strace xedit
都在
info proc *
本次课回答的问题
Take-away message