操作系统上的程序 (什么是程序和编译器) [南京大学2022操作系统-P2]

文章链接:https://cpt1024.blog.csdn.net/article/details/127704221
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);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
状态机和数码管实现
看文档
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");
}
1
2
3
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;
}
1
2
3
compiler barrier 将可以合并的代码划分开了
操作系统的一般程序
补
总结