课程网站 ,课程视频 ,OSTEP ,CSAPP 。
Part 1
资料:The Feynman Lectures on Physics ,ENIAC 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)
关键问题:操作系统如何发展成现在这样的?(硬件、软件)
工具:gdb
,strace
。(tldr
,xxd
)
资料:Vim help files ,logisim.c ,seven-seg.py ,minimal.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 ) { 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 实现)
关键概念:程序是状态机 。可以从以下两个视角,抽象的理解。
问题:如何构造一个最小的 “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 movq $1 , %rdi movq $st, %rsi movq $(ed - st), %rdx syscall movq $SYS_exit, %rax movq $1 , %rdi syscall st: .ascii "\033[01;31mHello, OS World\033[0m\n" ed: