2-虚拟内存的实现
虚拟内存实现页表
硬件通过处理器和 MMU(Memory Management Unit)实现
任何一条地址应该认为是虚拟内存地址;该地址会转到 MMU,MMU 翻译为物理地址,从物理地址加载
MMU 只是去查看 page table,page table 存在于内存中
虚拟内存地址只使用了低 39bit;低 12bit 作为页内地址偏移(offset),高 27bit 是索引页的 index,实际上是由 3 个 9bit 的数字组成(L2,L1,L0)。前 9 个 bit 被用来索引最高级的 page directory(注:通常 page directory 是用来索引 page table 或者其他 page directory 物理地址的表单
用 44bit 的 PPN,再加上 12bit 的 0,这样就得到了下一级 page directory 的 56bit 物理地址。这里要求每个 page directory 都与物理 page 对齐
3 级页表由硬件实现的,所以 3 级 page table 的查找都发生在硬件中。MMU 是硬件的一部分而不是操作系统的一 ...
5-硬件中断
Interrupts
中断与系统调用区别
asynchronous,异步,与当前运行在 CPU 的进程无关
concurrency,CPU 和产生中断的设备并行运行
program device,需要关注外部设备
中断处理——硬件
PLIC 会通知当前有一个待处理的中断
其中一个 CPU 核会 Claim 接收中断,这样 PLIC 就不会把中断发给其他的 CPU 处理
CPU 核处理完中断之后,CPU 会通知 PLIC
PLIC 将不再保存中断的信息
中断处理——软件使用驱动管理设备
bottom:通常是 Interrupt handler。当一个中断送到了 CPU,并且 CPU 设置接收这个中断,CPU 会调用相应的 Interrupt handler。Interrupt handler 并不运行在任何特定进程的 context 中,它只是处理中断。
top:是用户进程,或者内核的其他部分调用的接口。对于 UART 来说,这里有 read/write 接口,这些接口可以被更高层级的代码调用。
驱动中会有一些队列(或者说 buffer),top 部分的代码会从队 ...
3-系统调用和陷入
System calls and Trap
用户态和内核态的切换(trap)
程序执行系统调用(System call)
程序出现了类似 page fault、除 0 等异常(软件中断)
硬件中断(IO 设备)
RISC-V 寄存器
32 个通用寄存器
PC(程序计数器)
Mode(表明位于何种状态 user or supervisor)
SATP(指向页表的物理地址)
SEPC(指向 trap 指令的起始地址)
STVEC (也就是处理 trap 的内核指令地址)
SSRATCH(交换页表和 a0 地址)
内核态权限
读写控制寄存器:SATP、STVEC、SEPC
它可以使用 PTE_U 标志位为 0 的 PTE
supervisor mode 中的代码并不能读写任意物理地址,通过 page table 访问内存
用户态跳入内核态前
保存用户态 32 个寄存器
保存 PC
改变 Mode 为 Supervisor
改变 SATP 寄存器指向内核页表
将堆栈寄存器指向内核的地址
Trap 执行流程
在从用户空间进入到内核空间之前,内核会设置好 STVEC 寄存器指向 ...
6-多核和锁
Multiprocessor and Lock
锁就是一个对象,就像其他在内核中的对象一样。有一个结构体叫做 lock,它包含了一些字段,这些字段中维护了锁的状态。锁有非常直观的 API:
acquire,接收指向 lock 的指针作为参数。acquire 确保了在任何时间,只会有一个进程能够成功的获取锁。
release,也接收指向 lock 的指针作为参数。在同一时间尝试获取锁的其他进程需要等待,直到持有锁的进程对锁调用 release。
锁应该与操作而不是数据关联,所以自动加锁在某些场景下会出问题
想要程序简单点,可以通过 coarse-grain locking(注,也就是大锁),但是这时你就失去了性能
锁的特性
避免丢失更新
锁可以打包多个操作,使它们具有原子性
可以维护共享数据结构的不变性
challenge
死锁
破坏了程序的模块化
通常来说,开发的流程是:
先以 coarse-grained lock(注,也就是大锁)开始。
再对程序进行测试,来看一下程序是否能使用多核。
如果可以的话,那么工作就结束了,你对于锁的设计足够好了;如果不可以的话,那意味 ...
4-缺页中断
Page Fault
通过 page fault 可以实现的一系列虚拟内存功能
lazy allocation
copy-on-write fork
demand paging
memory mapped files
虚拟内存好处
isolation,隔离性;虚拟内存使得操作系统可以为每个应用程序提供属于它们自己的地址空间
level of indirection,提供了一层抽象,处理器和所有的指令都可以使用虚拟地址,内核会定义从虚拟地址到物理地址的映射关系
page fault 得到的信息
引起 page fault 的内存地址(STVAL 寄存器)
引起 page fault 的原因类型(SCAUSE 寄存器)
引起 page fault 时的程序计数器值,这表明了 page fault 在用户空间发生的位置(SEPC 寄存器中,trapframe->epc)
sbrk
当 sbrk 实际发生或者被调用的时候,内核会分配一些物理内存,并将这些内存映射到用户应用程序的地址空间,然后将内存内容初始化为 0,再返回 sbrk 系统调用。这样,应用程序可以通过多次 ...
3_Database_Storage I
3-Database Storage I1 DISK-BASED ARCHITECTURE
易失性存储和非易失性存储相结合
Volatile:Random Access Byte-Addressable (DRAM 之上)
Non-Volatile:Sequential Access Block-Addressable(SSD 之下 )
SSD 以下只能按块来存取
顺序访问和随机访问
非易失性存储中顺序访问比随机访问快得多
一般数据存储在连续的块中,同时分配多个物理页叫区
2 DBMS 设计目标
允许管理比可用内存大的数据库
读写磁盘代价高昂,尽可能避免大的停顿和性能下降
DBMS 希望最大化顺序读写
3 为什么不使用 OS
The DBMS can use memory mapping (mmap) to store the contents of a file into the address space of a program.
The OS is responsible for moving the pages of the file in and out of ...
lecture10_Combinational_Logic
Combinational LogicCMOS
Boolean algebra
Arithmetic Logic Unit (ALU)
lecture11_FSMs
FSMs, Synchronous Digital SystemsFSM: Finite State Machinestate transition diagram
s0 初始状态;input/output;箭头指向是 next state
clock and registersFlip-Flop
时钟上升沿;Q = D,其余时刻什么也不做
register delay
clk-to-q delay
Registers can’t transfer the D input to Q output instantly
clk-to-q delay: Time it takes after the rising edge for the Q output to change
register constraintssetup time
Setup time: Time before rising edge when the D input must be stable
hold time
D input cannot change before thi ...
lecture14_DataPath_Hazards
HazardsStructural Hazards
两条或更多指令在流水线需要访问同一个物理单元
Solutions
指令轮流使用物理资源
增加额外的硬件资源
设计指令集避免结构冒险
Data Hazards
Some regfiles support writing a new value to a register, then reading the new value, in the same cycle.
a register being written to is read from later.
Solutions
Stalling
Wait for the first instruction to write its result before the second instruction reads thevalue
Forwarding
Add hardware to send the result back to earlier stages before the result is written
Requires extra connection ...
lecture15_Data_Level_Parallelism
Data-Level ParallelismSIMD
single instruction, multiple data or vector instructions
SIMD 实现矩阵乘法
common mistake
直接使用 32-bit 的 SIMD vector(寄存器与内存不同)
使用_mm_load or _mm_store 时采用未对齐的内存
忘记处理尾部特殊情况
使用太多的 vector