课程官网:https://jyywiki.cn/OS/2023/
几个python的库:
z3 能求解方程组的 python 库
sympy 计算符号计算的库
numpy 数组、矩阵计算相关的
学习的时候存在的一定的割裂性,因为不同学科之间存在概念的独立性,学科之间的互通也被打破了。主要的点是A学科用到了B学科的知识点,但A学科并不会介绍学科B知识点出现的背景,并且学科B可能也没有给出该知识点出现是为了解决什么问题,或者说它可以用来解决什么样的问题。另外一个可能的原因在于,学科B当时所提出的知识点,并没有立即得到应用,当A学科用了,也只是用了,而没有强调其特性以及解决的问题。
任何工具的出现是为了应用和创新,如果只是单纯提出某种概念和定义是没有意义的。
老师提到了数学中关于群的概念可以看下这门课:http://www.math.clemson.edu/~macaule/classes/f22_math4120/
Demo:模拟数字系统
- logisim.c 模拟数字电路的代码
- seven-seg.py 根据数字电路模拟的结果显示成数码管
- Makefile 编译
逻辑电路的输入在程序中定义为 bool 类型,名字为 wire。定义了两个寄存器(触发器),b0 和 b1,这个两个寄存器的输入和输出分别是 X1、X和Y1、Y。b0 和 b1 的目的是使得 X=X1,Y=Y1。
执行程序的逻辑,就可以推出A -> G 的数值,在根据 seven-seg.py 中数码管的位置就可以得到对应的数字显示。
需要理解的地方是 NAND,这是一个与非门,可以通过它来构造其他的逻辑门。
#define NAND(X, Y) (!((X) && (Y))) // 与非门
#define NOT(X) (NAND(X, 1)) // 非门
#define AND(X, Y) (NOT(NAND(X, Y))) // 与门
#define OR(X, Y) (NAND(NOT(X), NOT(Y))) // 或门
另外一个需要理解的地方是 python 程序中的 exec,这是一个内置函数,用于执行字符串的python程序,例如:
exec("print('hello world')") // 执行 print 函数,输出 hello world
logicsim.c 编译得到的可执行文件最终输出的一行结果是:
A = 1; B = 1; C = 1; D = 1; E = 1; F = 1; G = 0;
这些内容就会被当成 python 的语句来执行。然后再通过 global 函数,就可以得到对应的参数值,如:
global()["A"] = 1
Demo 模拟 RISC-V 指令执行
- rvemu.c 模拟 RISC-V 的 CPU
- uncore.c 工具类的函数
- Makefile 编译
- ji-tu.txt 这个是要执行的指令
rvemu.c 这个文件中的main函数模拟了CPU的执行。
定义了一个指令的结构体:inst_t,实质上是一个 u32 的值,但是按照位划分为不同的字段,根据的是 R-type 类型的指令的来分的,具体可以查看 RV32I 指令类型。
typedef struct {
u32 op:7; // 操作数占用 7 位
u32 rd:5;
u32 f3:3;
u32 rs1:5;
u32 rs2:5;
u32 f7:7;
} inst_t;
inst_fetch函数则是从输入部分一次读入一条指令。
对照:https://blog.csdn.net/weixin_46623752/article/details/125355508
没太看懂它这个指令具体的含义,是如何解决鸡兔同笼问题的。
需要再补充看下这部分。