1.操作系统概述【操作系统:设计与实现】

linlh2020 / 2023-05-06 / 原文

课程官网: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
没太看懂它这个指令具体的含义,是如何解决鸡兔同笼问题的。
需要再补充看下这部分。