CS61c_11 — OS and VM

关于Project 3

  • 我之所以来写os,vm的新课,是因为project 3的part B部分难度有一点点点点大,尤其是control signal设计部分,我感觉ROM是更简单的,但文档推荐用hard-wire的方式来实现,感觉人有点麻了。

A real computer

  • 按照视频的时间线,我们现在应该是已经实现了project 3,并且在下一个cache的lab中添加了缓存模块提升了它的性能,此时我们设计的processor能够执行所有的RISC-V指令了(整数?),但是它还不是一个真正意义上的计算机,因为它没有Screen, Keyboard, Disk等外设,奥对了,还没有主内存呢。

Some simple small computer

  • 有一些计算机是非常简单的,甚至没有外设,只有一个cpu和一些内存,我们将其称之为single-board computers, 其中一个非常受欢迎并且开创了单片机时代的是Raspberry Pi, 也就是我们熟知的树莓派,比如Raspberry Pi 4, 它有一个CPU,一个DRAM,一个Storage(用的不是硬盘,而是SD卡,就像很多相机一样),两个hdmi视频输出口,4个usb接口,一个网线接口,一个无线wifi模块,真是麻雀虽小,五脏俱全。
  • 你可能觉得这个小小的单片机没啥意思,但是如果我们将它的IO接口和外设都连起来,那么我们将得到一个真正意义上的计算机了,甚至我们完全可以使用它作为学习这门课程的主机。(作为一个装机小白,我觉得单片机就是一个电脑主板装好了一个cpu和内存,闪存,剩下几个接口可以diy)
  • 如图,连上两个显示屏,键盘,鼠标后是不是氛围感一下就拉满了😉,图中的单片机装上了linux以及配套工具,它完全能胜任学习计算机体系课程的任务,可惜的是树莓派是基于arm设计的,而arm开源程度有限,lab设计会很麻烦,伟大的Nikolic老师说等以后risc-v的板子变得便宜且好用的话会考虑在cs61c中引入!

  • 一个值得思考的问题,我们之前使用过的venus是一个risc-v的模拟执行器,它仅仅能够执行单个程序并且stop,但是屏幕中的是一个UI界面,我们可以同时进行很多的活动,比如打开多个窗口,运行多个程序,这些都是一个venus无法做到的。令人震惊的是为了实现这个目的,我们并没有对硬件做出太大的改变,我们只是通过软件的方式实现了一个叫做操作系统的东西,来管理这些程序的运行,分配资源,调度任务,这就是我们这节课的主题 —— The Operating System(OS). ps:这个课引入os也太好了吧,还和前面用过的venus互动了,一做对比立马明白os的作用了

Operating System Basics

  • Well, “Just software”, but a very important one. 有一个妙妙网站展示了从小到大各种软件的代码量,其中有不少我们的老熟人。

What Does the OS do?

  • 我们从计算机开机开始说起:
  1. 在按下开机键后,首先执行 UEFI 固件。UEFI 负责检查硬件是否正常,然后扫描 EFI 系统分区(ESP),在分区里找到 bootloader(一个 .efi 文件)并执行它,由 bootloader 负责加载操作系统。
  2. So OS is the (first) thing that runs when computer starts.
  3. Finds and controls all devices in the machine in a general way, relying on hardware specific “device drivers”. 在linux中,我们一般称之为hardware tree, 是一种树形结构。
  4. Starts services (100+)
    • File system
    • Network stack (Ethernet, wifi, Bluetooth, etc.)
    • TTY (keyboard),
    • ….
  5. Loads,runs and manages programs
    • Multiple programs at the same time (time-sharing)
    • Isolate programs from each other (isolation)
    • Multiplex resources between applications (e.g., devices)
  • What Does the Core of the OS Do?
    • Provide isolation between running processes.
    • Provide interaction with the outside world.

What Does OS Need from Hardware?

  • Memory translation
    • 我们可以设想一下,如果我们有两个进程,都对physical address 0x1000进行操作,那么会发生打架;于是操作系统会为每一个进程提供一个map,将它们的virtual address映射到physical address上,这样就实现了进程之间的隔离。
    • 我们在risc-v中使用load和store的时候,进程实际上也是发送了一个virtual address,我们需要添加一个address translation硬件来实现这种转换。
  • Protection and privilege
    • Split the processor into at least two running modes: “User” and “Supervisor”. In RISC-V, we have “Machine” between them.
    • Lesser privilege can not change its memory mapping. But “Supervisor” can change the mapping of any given program. And supervisor has its own set of mapping of virtual->physical.
  • Traps & Interrupts
    • A way of going into Supervisor mode on demand. 比如当一个程序被外部信号打断了,或者是一个内部错误了,此时需要进入Supervisor mode或者说是进入内核态来处理这些异常情况。

What happens at Boot?

1. BIOS*: Find a storage device and load first sector(block of data) 2. Bootloader (stored on,e.g., disk): Load the OS kernel from disk into a location in memory and jump to it. 3. OS Boot: Initialize services, drivers, etc. 4. Init: Launch an application that waits for input in loop (e.g., Terminal/Desktop/…)

  • 似乎前面写过一遍了,这里似乎还提到了flash ROM,呃呃,暂时没想明白。。。

Operating System Functions

Launching Applications

  • Both threads and processes run (pseudo) simultaneously(伪同时).
  • Apps 一般是被其他进程(e.g.,shell)调用系统命令启动的,比如在linux中我们通常使用fork来创建一个新的进程,并且使用execve来加载可执行文件到这个新进程中去运行。
  • 我们将这个可行性文件加载到内存中(instruction & data),并且设置堆栈,设置argc,argv,跳转到main开始执行,与此同时shell会等待main返回(join).

Supervisor Mode

  • 操作系统需要在Super模式下运行,因为它需要强加一些资源上的限制到进程上,来管理这些进程。我们可以通过简单的修改一些csr状态寄存器的值来转换到super mode。
  • 在super mode下,我们甚至可以执行一些特殊的指令。

Syscalls

  • 试想我们将要向wifi发送一段数据,如果我们直接使用自己写的传输代码,那么多个进程之间可能会冲突,所以我们使用syscall,当一个进程想要发送数据时,它需要在register中准备好函数的参数,然后raise一个software interrupt,进入内核态,由操作系统来完成这个发送数据的任务,这样就避免了多个进程之间的冲突了(由操作系统来安排对资源和设备的访问顺序).

Interrupts, Exceptions

  • 我们需要进入内核态,当有一些事情发生的时候。
  • Interrupts: External events (e.g., timer, keyboard, network, etc.)
  • Exceptions: Internal events (e.g., page fault, illegal instruction, etc.)
  • ECALL: 这个指令用于将当前的用户状态转移到内核态,通常我们会设置一些参数(系统函数)来执行一些系统调用。它本质上是激发了一个exception。
  • EBREAK: 也会激发一个exception,但是不会进入内核态。

TMD,好大儿cyz找了个对象快活的不得了,写不下去了😭😇😭

  • 正好剩下的内容都是一些细枝末节,就不写了。。。
Licensed under CC BY-NC-SA 4.0
啊啊啊啊啊啊啊
使用 Hugo 构建
主题 StackJimmy 设计