文章目录
P1 计算机概论
什么是操作系统?
P2操作系统上的程序
- 补ppt ppt
tmux 快捷键操作
- https://www.jianshu.com/p/01a18efe2552
数字逻辑电路:模拟器
#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);
}
}
状态机和数码管实现
-
看文档
-
gcc a.out | python3 seven-seg.py
-
http://jyywiki.cn/OS/2022/slides/2.slides#/2/2
-
py代码 接受每一个输入 然后显示
-
通过 || 将c程序的输出作为py程序的输入
程序
- 程序 == 状态机
- gdb a.out 进入调试状态
layout src
进入 用 c的方式- layout asm 用汇编的形式进入
- start 运行 s 下一步 info frame 查看栈帧
C语言视角
C 程序的状态机模型 (语义,semantics)
状态 = 堆 + 栈
初始状态 = main 的第一条语句
迁移 = 执行一条简单语句
任何 C 程序都可以改写成 “非复合语句” 的 C 代码
-
函数调用 : 创建栈帧 pc ++
-
函数返回 消除栈帧
-
本质仍然是计算
二进制程序
构造最小的 Hello, World
int main() {
printf("Hello, World\n");
}
-
gcc 编译出来的文件不满足 “最小” --verbose 可以查看所有编译选项 (真不少)
printf 变成了 puts@plt -static 会复制 libc -
汇编实现 :http://jyywiki.cn/pages/OS/2022/demos/minimal.S
最小的 HolloWorld程序
- 程序== 状态机 == 二进制代码 = 状态机
- 如果想让程序退出 就必须得有一段系统调用
syscall
补充知识点
- retq 的行为 : pop 栈顶内容弹出给到PC
- 栈是由寄存器 rsp控制的
编译器与编译优化
- 什么是正确的编译?
- 编译的优化 : 没有对状态机状态进行修改f的语句能删
- C代码 -> 汇编代码
- c编译器 code = compile(S) S; 源代码
void foo() {
int x = 1;
}
- compiler barrier 将可以合并的代码划分开了