锁的实现 自旋锁(Spin lock)的实现 什么是自旋锁自旋锁是一种忙等待的锁机制。锁的特性就是只有一个进程可以获取锁,在任何时间点都不能有超过一个锁的持有者。在acquire里面有一个死循环,循环中判断锁对象的locked字段是否为0,如果为0那表明当前锁没有持有者,当前对于acquire的调用可以获取锁。之后我们通过设置锁对象的locked字段为1来获取锁。最后返回。 但两个进程可能同时读到 lo 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
线程切换(2) 线程切换过程中锁的限制 在线程切换的过程中需要一直持有p->lock 防止两个CPU核使用同一个栈运行同一个线程 XV6中,不允许进程在执行switch函数的过程中,持有任何其他的锁。 防止死锁。示例:如果xv6在内核中关闭了中断,P1的内核线程持有了p->lock以外的其他锁,这些锁可能是在使用磁盘,UART,console过程中持有的。之后内核线程在持有锁的时候,通过调用s 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
线程切换(1) xv6中的线程一个线程可以认为是串行执行代码的单元。 内核线程的概念,对于每个用户进程都有一个内核线程来执行来自用户进程的系统调用。所有的内核线程都共享了内核内存,所以XV6的内核线程的确会共享内存。 每一个用户进程都有独立的内存地址空间,并且包含了一个线程,这个线程控制了用户进程代码指令的执行。所以XV6中的用户线程之间没有共享内存,你可以有多个用户进程,但是每个用户进程都是拥有一个线程的独立 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
系统调用和trap 简单介绍这篇笔记主要帮助回顾xv6是如何经过trap陷入到内核去的,介绍相关的代码的重要的细节。 重要的寄存器 SATP(Supervisor Address Translation and Protection):它包含了指向page table的物理内存地址 STVEC(Supervisor Trap Vector Base Address Register):它指向了内核中处理trap 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
文件系统层级结构 1.文件系统组织架构 disk层:对硬盘上的块进行读写操作 buffer cache层:在内存中对磁盘块进行缓存,并确保只有1个内核进程能在一段时间内修改文件块上存储的数据。 logging层:让更高的层级能够将对文件块的所有update打包到一个transaction中,从而能保证所有文件块能够在将要崩溃时原子地进行update inode层:为每个文件提供独一无二的inode num 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
中断与设备驱动程序 什么是中断中断对应的场景很简单,就是硬件想要得到操作系统的关注。操作系统需要做的是,保存当前的工作,处理中断,处理完成之后再恢复之前的工作。这里的保存和恢复工作,与我们之前看到的系统调用过程非常相似。所以系统调用,page fault,中断,都使用相同的机制。 中断与系统调用的区别 asynchronous(异步性):当硬件生成中断时,Interrupt handler与当前运行的进程在CP 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Sleep&&Wakeup Sleep & wakeupsleep是当一个进程在等待某一个事件时陷入休眠状态,当这个事件发生时另外一个进程唤醒它。陷入休眠状态可以让这个进程不在等待的时候占用CPU资源 sleep(chan)让这个进程睡眠在chan这个wait channel上,wakeup(chan)将所有睡眠在chan上的进程全部唤醒。 lost wake-up problem:当一个进程A即将睡眠时,另外一个进 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab9:File System Large Files我们知道,在我们现在的xv6文件系统设计中,每一个文件最大只能有268*BSIZE(12 + 256),一个文件(inode)有12个direct block,还有1个singlely-indirect block。 1uint addrs[NDIRECT+1]; // struct inode 这里,我们将为文件进行扩容,添加一个doubly-indirect的bl 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab6:Thread Uthread: switching between threads题目概述:补充代码展现线程调换的机制。代码在文件user/uthread.c 和 user/uthread_switch.S中。主要内容见课程主页。 首先需要在thread结构体中添加一个user_context保存上下文。12345678910111213141516171819202122232425st 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs
Lab8:Lock Lock LabMemory allocator操作系统把物理内存组织成一个链表,每个CPU获取物理内存时都需要在这个链表中进行获取,这样当多个CPU获取时就要通过锁保护好这个链表,而在这个实验中,我们需要为每一个CPU都分配一个物理内存的链表,这样就可以降低kalloc实现中锁的竞争。 但存在这样一种情况,某一个CPU中kalloc过多导致它自己的链表中空闲的物理页面已经不足了,这就需要它从其他 2024-02-29 操作系统 > xv6-labs #操作系统 #xv6-labs