欢迎光临散文网 会员登陆 & 注册

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

2023-03-31 11:52 作者:Cpt_1024  | 我要投稿

文章链接: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 将可以合并的代码划分开了


操作系统的一般程序




总结




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

分享到微博请遵守国家法律