11 篇文章
分时多任务OS
BatchOS介绍
LibOS介绍
Coordination 1 进程切换过程 一个进程出于某种原因想要进入休眠状态,比如说出让 CPU 或者等待数据,它会先获取自己的锁; 之后进程将自己的状态从 RUNNING 设置为 RUNNABLE; 之后进程调用 switch 函数,其实是调用 sched 函数在 sched 函数中再调用的 switch 函数; switch 函数将当前的线程切换到调度器线程; 调度器线程之前也调用了 switch 函数,现在恢复执行会从自己的 switch 函数返回; 返回之后,调度器线程会释放刚刚出让了 CPU 的进程的锁 // 需要切换的进程 acquire(&p->lock); p...
进程切换 P1 进入内核,切换到调度器进程,调度器进程切换到 P2 核心函数为 swtch()函数;该函数保存并加载部分寄存器的值(RISC-V 中存在调用者保存并恢复的寄存器(caller-saved registers),不需要保存全部寄存器) 切换过程 yield 调用了 sched 函数 sched 函数进行合理性检查,最后调用 swtch 函数交换当前进程的上下文和 CPU 调度线程的上下文,返回地址为切换后上下文的 ra 寄存器存的值;实际上是 scheduler 函数 void sched(void) { int intena; struct proc *p = myproc()...
OS 的隔离性 需要不同的应用程序之间有强隔离性 需要 OS 与应用程序间也有强隔离性 OS 隔离保证 multiplexing 和内存隔离 multiplexing(CPU 在多进程同分时复用):不论应用程序在执行什么操作,multiplexing 都会迫使应用程序时不时的释放 CPU,这样其他的应用程序才能运行。 不同应用程序之间的内存是隔离的,应用程序之间不会相互覆盖 硬件支持强隔离 uer/kernel mode 在处理器里面有一个 flag。在处理器的一个 bit,当它为 1 的时候是 user mode,当它为 0 时是 kernel mode。当处理器在解析指令时,如果指令是特殊...
虚拟内存实现 页表 硬件通过处理器和 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 tab...
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 标...
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 的原因类型(...
Interrupts 中断与系统调用区别 asynchronous,异步,与当前运行在 CPU 的进程无关 concurrency,CPU 和产生中断的设备并行运行 program device,需要关注外部设备 中断处理——硬件 PLIC 会通知当前有一个待处理的中断 其中一个 CPU 核会 Claim 接收中断,这样 PLIC 就不会把中断发给其他的 CPU 处理 CPU 核处理完中断之后,CPU 会通知 PLIC PLIC 将不再保存中断的信息 中断处理——软件 使用驱动管理设备 bottom:通常是 Interrupt handler。当一个中断送到了 CPU,并且 CPU 设置接收这...
Multiprocessor and Lock 锁就是一个对象,就像其他在内核中的对象一样。有一个结构体叫做 lock,它包含了一些字段,这些字段中维护了锁的状态。锁有非常直观的 API: acquire,接收指向 lock 的指针作为参数。acquire 确保了在任何时间,只会有一个进程能够成功的获取锁。 release,也接收指向 lock 的指针作为参数。在同一时间尝试获取锁的其他进程需要等待,直到持有锁的进程对锁调用 release。 锁应该与操作而不是数据关联,所以自动加锁在某些场景下会出问题 想要程序简单点,可以通过 coarse-grain locking(注,也就是大锁),但是...