操作系统基础复习| 青训营笔记

126 阅读2分钟

@[toc]

P1 计算机概论

什么是操作系统?

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

P2操作系统上的程序

tmux 快捷键操作

数字逻辑电路:模拟器

#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

  • jyywiki.cn/OS/2022/sli…

  • 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

  • 汇编实现 :jyywiki.cn/pages/OS/20… 在这里插入图片描述

在这里插入图片描述

最小的 HolloWorld程序

  • 程序== 状态机 == 二进制代码 = 状态机
  • 如果想让程序退出 就必须得有一段系统调用 syscall

补充知识点

  • retq 的行为 : pop 栈顶内容弹出给到PC
  • 栈是由寄存器 rsp控制的 在这里插入图片描述

编译器与编译优化

  • 什么是正确的编译?
  • 编译的优化 : 没有对状态机状态进行修改f的语句能删
  • C代码 -> 汇编代码
  • c编译器 code = compile(S) S; 源代码
void foo() {
 int x = 1;
} 

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

  • compiler barrier 将可以合并的代码划分开了 在这里插入图片描述

操作系统的一般程序

在这里插入图片描述

总结

在这里插入图片描述