9.1 前言
本章将介绍dummyxv6的外部中断响应机制。dummyxv6是运行在RISC-V架构的处理器之上的教学级操作系统,其外部中断机制,主要依赖RISC-V的PLIC(Platform Level Interrupt Controller)来实现。本章首先会介绍PLIC响应外部中断的整体流程;然后在PLIC中断响应机制上,dummyxv6如何处理键盘按键事件,并输出到屏幕上;接着会介绍这些流程的实现代码。
[Read More]本章将介绍dummyxv6的外部中断响应机制。dummyxv6是运行在RISC-V架构的处理器之上的教学级操作系统,其外部中断机制,主要依赖RISC-V的PLIC(Platform Level Interrupt Controller)来实现。本章首先会介绍PLIC响应外部中断的整体流程;然后在PLIC中断响应机制上,dummyxv6如何处理键盘按键事件,并输出到屏幕上;接着会介绍这些流程的实现代码。
[Read More]本章的内容,是介绍dummyxv6系统的调度机制。本章先会略过许多代码细节,从高层次阐述调度机制的流程,再展示dummyxv6支撑调度机制的其他细节。在本章配套的代码中,内核运行在只有一个CPU核心的虚拟设备上,内核初始化阶段会创建两个用户进程,这个用户进程将会运行一段无限循环指令,然后通过定时器中断来触发进程切换,最后实现任务调度机制。
[Read More]上一章读者们学习了dummyxv6的物理内存初始化流程,本章将进入新的章节,本章主要介绍虚拟内存和物理内存的概念,然后介绍虚拟内存和物理内存的映射流程,最后会引入页表的概念,以及dummyxv6如何实现页表功能。
[Read More]前面的章节介绍了dummyxv6内核的很多基础模块,本章要介绍的是内核的物理内存管理机制。物理内存,即是设备所持有的实际的内存,内核对物理内存进行统一管理,可以方便后续实现进程逻辑的时候的内存分配和回收,因此本章涉及的内容非常重要。现在将逐个章节开始介绍。
[Read More] 截止到上一章,dummyxv6实现的操作系统部分均是在单个核心内跑的逻辑。设想一下,printf函数会按格式要求输出参数到显示设备,这个操作在只有一个核心的CPU上运行是没有问题的,但是如果多个核心并行运行,那么比如hart0正在运行printf相关的指令的时候,hart1也开始执行printf相关的指令,那么hart0涉及的输出内容可能会掺杂hart1正在输出的内容,这显然不是我们想要的结果,为了保证输出操作的原子性,就需要引入锁的概念了。
上一章阐述了必须在机器模式下执行的初始化操作,并且介绍了dummy-xv6的内核模块初始化是在main函数里执行的。main函数是在CPU的内核模式下运行的,而本章开始,会陆续往main函数里写入内核模块初始化相关的逻辑。
所有的一切,都要从输入输出开始,而输出则需要更早实现,因为没有输出,我们将无法高效率得获得反馈信息,这将极大降低读者们的调试效率。本章要实现的正是初版的printf模块,这个printf模块没有线程安全,因此本章对应的用例也只是在一个核下运行,笔者将在下一章实现自旋锁,然后再完善printf模块的线程安全机制。彼时,读者就能看到完整的内核级别的printf模块了。
与IO设备进行通信,需要用到协议,比如UART协议、USB协议等。本章要介绍的是最简单的UART协议,虽然当今市场USB大行其道,但是UART协议还是广泛被使用的,本章首先会着重介绍UART协议的原理,像这种在内核实现的与输入输出设备交互的模块,也被称为驱动。
上一章,笔者带领大家迅速过了一下一个hello world程序的运行流程,然后粗略介绍了操作系统的概念和作用,接着介绍了dummy-xv6项目,以及RISC-V的通用寄存器和它的调用规范,最后介绍了怎么编译dummy-xv6项目。上一章读者们编译得出了一个名为kernel的可执行文件,细心的读者可能会问,这个kernel是否就代表操作系统?如果不是,它和操作系统是什么关系呢?本章将就操作系统进行更深入的探讨。
[Read More]在开始阅读本系列之前,读者们不妨先问自己几个问题?
如果你的回答都是否,那么你可能是一位操作系统专家,本系列并不适合你。如果上面的问题中,你有一个,甚至多个回答是“是”,那么不妨多了解一下这个系列。
这是笔者继《Lua解释器构建:从虚拟机到编译器》系列之后的新系列,《操作系统构建:从0实现xv6系统》,xv6系统是美国麻省工程学院开发的一款面向教学的Unix Like操作系统,它旨在向学生展示一个完整而简单的操作系统原型,帮助学生理解操作系统的基本概念。
然而,从笔者创建的技术讨论社区来看,xv6尽管已经非常精简,但是对一些新人来说,研究起来还是有一些小费劲。对此,笔者应一部分粉丝的要求,和上一个系列一样,着手拆解xv6操作系统,一步一步实现它,并在原有基础上拓展图形界面,并实现两个能在这个操作系统上跑的小游戏。这个项目笔者将其称之为dummyxv6。
dummyxv6是一个开源项目,它的地址位于这里。欢迎广大读者点击这个链接,并star这个项目。在开始我们的旅程之前,读者需要下载一些软件,整个工程是在运行在Virtual Box上的Ubuntu Server系统上开发,并且在Ubuntu Server上实用QEMU进行运行,验证和调试。因此读者需要下载并安装如下软件:
一直对glibc的内存分配器的设计与实现感兴趣,之前一直没有下定决心以及抽出足够的时间进攻这个方向,最近抽出了几天对glibc的ptmalloc源码进行了梳理和研究,现在将研究成果梳理总结成文。
为什么要写这篇文章?相信很多读者对系统是怎样管理内存感兴趣,通过深入研究ptmalloc,读者可以深刻了解到系统是怎样减少内存碎片,如何提升多线程环境下的内存分配和释放的性能,这对读者更好地进行系统编程有着直接或间接的帮助。本文立足于glibc 2.26的源码,为了方便读者理解和方便笔者书写,着重介绍概念和运作原理,不会贴大段的代码,各位看官大可放心食用。最有本人水平有限,如有书写不当的地方欢迎大家联系我修改,欢迎大家加入技术讨论群:QQ185017593。