南京大学 操作系统 课程总结 2022

课程网站课程视频OSTEPCSAPP

Part 1

资料:The Feynman Lectures on PhysicsENIAC Simulator and Related Material

思考 Why - What - How,为什么 - 是什么 - 怎么做

Operating System: A body of software, in fact, that is responsible for making it easy to run programs (even allowing you to seemingly run many at the same time), allowing programs to share memory, enabling programs to interact with devices, and other fun stuff like that. (OSTEP)

关键问题:操作系统如何发展成现在这样的?(硬件、软件)


工具:gdbstrace。(tldrxxd

资料:Vim help fileslogisim.cseven-seg.pyminimal.S

以下代码是 logisim.c 的简化版,实现数字逻辑电路的模拟器。我们可以在 vim 中使用 !gcc % && ./a.out 命令,运行如下代码。代码中使用 X macro 技巧,我们可以使用 !gcc -E % 命令输出宏展开之后的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <unistd.h>

#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
int main() {                                      
static int X, X1; static int Y, Y1;;
while (1) {
X1 = !X && Y; Y1 = !X && !Y;;
printf("X" " = %d; ", X); printf("Y" " = %d; ", Y);;
X = X1; Y = Y1;;
putchar('\n'); sleep(1);
}
}

程序 seven-seg.py 使用 ANSI escape code 来控制字符的颜色。\033[37m\033[31m 分别表示,将当前和之后的字符设置为白色、红色,而 \033[0m 表示重置设置。\033[2J 表示清空屏幕同时将光标移至左上角,\033[1;1f 表示将光标移至第 1 行和第 1 列(应该是这样,HVP 和 CUP 的区别没看懂)。最后,我们可以使用管道,将 logisim.c 的输出作为 seven-seg.py 的输入,从而模拟数码管的显示(执行 ./a.out | python3 seven-seg.py 命令)。

彩蛋:telnet towel.blinkenlights.nl(命令行电影),ssh sshtron.zachlatta.com(网络游戏)。(使用 ANSI escape code 实现)

关键概念:程序是状态机。可以从以下两个视角,抽象的理解。

  • 源代码视角:状态 = 栈帧列表(每个栈帧都有 PC)+ 全局变量。

  • 二进制视角:状态 = 寄存器 + 内存,程序 = 计算指令 + syscall 指令。

问题:如何构造一个最小的 “Hello, World” 程序?(RTFM,man syscall

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <sys/syscall.h>

.globl _start
_start:
movq $SYS_write, %rax // write(
movq $1, %rdi // fd=1,
movq $st, %rsi // buf=st,
movq $(ed - st), %rdx // count=ed-st
syscall // );

movq $SYS_exit, %rax // exit(
movq $1, %rdi // status=1
syscall // );

st:
.ascii "\033[01;31mHello, OS World\033[0m\n"
ed:

作者

Ligh0x74

发布于

2024-08-14

更新于

2024-08-18

许可协议

评论