随笔分类 - 操作系统
摘要:虚拟内存提供了一个中间层:内核可以通过将PTE标记为invalid或者read-only来拦截内存引用,这会导致page fault,此时,你可以通过修改PTE来改变地址的含义。在计算机系统中有一种说法,任何系统问题都可以通过中间层解决。lazy allocation实验提供了一个例子,本次实验将探
阅读全文
摘要:文件系统的一个目标是组织和存储数据。文件系统通常支持在用户和应用之间共享数据,以及持久化它们以让重启后数据仍然可用。 xv6文件系统提供Unix风格的文件、目录以及路径名(查看第一章)并且将它的数据存储在virtio磁盘上以持久化(查看第四章)。文件系统面临多种挑战: 文件系统需要磁盘数据结构来表示
阅读全文
摘要:任何操作系统都希望运行比计算机所拥有的CPU数量更多的进程,所以,我们需要一个在进程之间时分CPU的计划,理想状态下,这种共享对用户进程透明。给每一个进程提供它拥有自己的虚拟CPU的通用方式是在多个硬件CPU上多路复用进程。这一章解释了xv6如何实现多路复用。 7.1. 多路复用 xv6会在每个CP
阅读全文
摘要:包括xv6在内的大多数内核都会交错的执行多个活动,一个原因来自于多处理器硬件:计算机有多个独立运行的CPU,比如xv6的RISC-V,这些CPU共享物理内存,并且xv6利用这一点来维护被所有CPU共同读写的数据结构。这种共享提高了在一个CPU正在更新数据结构的过程中另一个CPU读取该数据结构的可能,
阅读全文
摘要:Trap和系统调用 中断和设备驱动 驱动是操作系统用于管理特定设备的代码:它配置设备硬件,通知设备执行操作,处理返回的中断,并且与可能在该设备上进行I/O等待的进程交互。编写驱动代码可能很棘手,因为驱动与它管理的设备是并行执行的,此外,驱动必须理解设备硬件接口,这可能是复杂的并且缺乏文档。 需要被系
阅读全文
摘要:当硬件对用户使用的虚拟地址进行翻译时,若该虚拟地址不正确,比如尚未映射、权限不足等,硬件会产生一个page fault陷阱给操作系统,就是这样一个看似简单平常的机制,却给了操作系统很大的能力,它可以做很多有趣的事。 lazy allocation:操作系统在给用户进程分配内存时,可以先不分配实际的物
阅读全文
摘要:今天分析一下xv6中的内核页表挂载流程,可能会做下pagetable lab。 启动 // start()会在每一个CPU上,以supervisor mode跳转到这里 void main() { // 确保只有一个CPU执行一次 if(cpuid() == 0){ kinit(); // 物理页分
阅读全文
摘要:这篇文章通过gdb跟踪基于risc-v架构的xv6系统中write系统调用的处理流程。 系统调用是操作系统给应用程序提供的操作底层硬件资源的简单清晰的接口,隐藏底层资源的复杂性,比如UNIX会把网络、磁盘等一系列东西都抽象成文件,然后你可以简单的使用write对它们进行读写,你无需关心磁道、扇区等概
阅读全文
摘要:这篇文章只是简单的对日志结构文件系统LFS做一个简要了解,很多细节没有 传统文件系统的问题 在内存越来越大的今天,无论是操作系统还是应用软件越来越趋向于在内存中建立更多的磁盘缓存,这带来了更多的写入。 在传统文件系统中,写入操作要更新很多个块,各种位图、inode、数据块、父inode等,即使是将它
阅读全文
摘要:问题:数据不一致 假设现在我们有一个普通的文件系统,它由简单的inode块、数据块和它们各自的位图组成。 现在有一个inode——I,I[v1]代表它目前是第一个版本,它的一个指针指向了数据块Da。 版本只是为了举例子,并不是文件系统记录了inode的版本信息 现在,你需要打开这个文件,跳到它的末尾
阅读全文
摘要:本篇笔记记录了OSTPE中介绍的一种简单的文件系统VSFS的实现。 文件系统,就是一种关于如何在磁盘这种块设备中建立文件、文件夹概念的一套规范 块大小定义 为了方便,文件系统需要以一种单元来操作磁盘,这个单元就是块。VSFS选择常见的块大小——4KB,并且只使用这一种大小。比如,下面是一个具有256
阅读全文
摘要:本文是《OSTPE》的笔记,由浅入深介绍计算机中的内存虚拟化技术。 为了实现隔离性以及编程的简单性,操作系统提供内存虚拟化技术,给每个进程制造自己在独占内存的假象。 基址、界限寄存器 假设: 为所有进程分配同样大小的内存空间 该空间小于物理内存空间 进程地址空间保存在连续的内存中 在这三个假设的前提
阅读全文
摘要:本篇介绍操作系统如何调度应用程序,一个我们必须考虑的问题是,应用程序究竟是什么样的,比如它是: 经常需要与用户交互(等待用户输入)的交互型应用程序(或者说IO密集型应用) 长时间占用CPU,基本没有IO的应用程序 这引出了两个指标,交互型应用程序比较重视响应性,即任务多久会被响应,长时间占用CPU的
阅读全文
摘要:操作系统的一个任务是虚拟化CPU,让每个进程以为自己在独占CPU。 现代操作系统采用分时的方式来完成这个工作,一个进程获得CPU,运行一段时间,另一个进程再获得CPU去运行,这些进程不断的切换,从而达到让一个物理CPU虚拟给多个进程的目的 但这其中有很多问题 如何限制进程访问资源——用户模式/内核模
阅读全文
摘要:同步阻塞、同步非阻塞 哪里阻塞? 考虑一个网络应用,通信双端需要交换数据,接收方能接到数据的前提是发送方发送了数据,下图中,发送方根本没法数据,接收方收个毛线? 而这里的阻塞,说的就是当接收方调用recvfrom开始接收数据时,若没有数据到达TCP接收缓冲,接收方是否阻塞。 所以 同步阻塞:当调用r
阅读全文
摘要:原书《操作系统精髓与设计原理——富兰克林》第九章。 处理器调度的类型 长程调度:指操作系统把一个程序转换成可执行的进程的过程,转换后该进程可能直接以就绪态进入内存,也可能以挂起态在磁盘中,等待进一步的调用 中程调度:指操作系统把磁盘中的进程装载到内存中的过程 短程调度:指操作系统使用某些策略调度在内
阅读全文
摘要:原书《操作系统精髓与设计原理——富兰克林》第八章。 虚拟内存 我们的程序只能运行在内存中,这是即使有了虚拟内存也依然存在的一个限制。 传统的进程内存分配设计让一个进程必须完全加载进内存中,要么就完全被换出到磁盘中,这让操作系统能够在内存中同时容纳的进程数量受限,而且如果你开发一个很大的程序,大到内存
阅读全文
摘要:原书《操作系统精髓与设计原理——富兰克林》第七章。 内存管理的需求 重定位:进程通常没有直接通过物理内存地址访问内存的能力,这是为了保证隔离性和安全,还有提供一定程度的抽象,让程序员不再和物理内存打交道。所以要有一种方式将进程中的逻辑地址映射到物理地址。 保护:进程不能访问不属于它的内存区域。 共享
阅读全文
摘要:原书《操作系统精髓与设计原理——富兰克林》第六章。 死锁的产生 死锁的产生就是由于一些进程对一些互斥资源不合时宜的访问。 资源可以是IO设备啊、内存单元啊、CPU啊、文件等,一个进程通常都是获取它们,然后运行一段事件,释放它们,并且当一个进程获取它们的时候其他进程不允许获取。有些类型的资源有多个实例
阅读全文
摘要:原书《操作系统精髓与设计原理——富兰克林》第五章。 不论是进程还是线程,不论是单处理器的多道程序设计还是多处理器甚至是分布式系统,因为程序能并发或者真正的并行执行,所以都面临着一系列的并发问题。比如一个进程正在访问打印机,另一个进程也要使用打印机,如果没有一些手段来处理这些并发问题,两个进程输出给打
阅读全文
