xv6-十
前言这篇博客研究xv6的虚拟内存的管理机制
Lab mmap本次lab用来实现xv6的虚拟内存的管理机制
要求
mmap can be called in many ways, yet this lab requires only a subset of its features relevant to memory-mapping a file. You can assume that addr will always be zero, meaning that the kernel should decide the virtual address at which to map the file. mmap returns that address, or 0xffffffffffffffff if it fails. length is the number of bytes to map; it might not be the same as the file’s length. prot indicates whether the memory should be map ...
分区-文件系统
前言这篇博客主要介绍磁盘中的两个重要概念——文件系统和分区。并通过这些概念,理解grub构建启动盘的原理
分区出于某些原因(如需要多重引导等),磁盘需要被分割成多个独立的分区进行管理
则这些分区信息(被称为分区表)需要被存储在磁盘的固定位置(往往是磁盘起始地址),从而方便其余设备识别分区信息
现在常用的分区表格式有Master Boot Record(MBR)和Globally-Unique-Identifiers Partition Table(gpt)
MBRMBR位于磁盘的第一个扇区中,其基本格式如下所示
GPTGPT位于磁盘的前34个扇区,其基本格式如下所示
可以看到,其兼容MBR
文件系统xv6中有一句经典的描述
文件系统又被称为on-disk数据结构
因此,文件系统中,数据在磁盘上的组织逻辑就是整个文件系统的重点之一,其一般布局如下所示
创建一个文件系统,就是创建该文件系统的诸如superblock等的metadata
分区和文件系统实际上,分区和文件系统的关系并不是非常紧密。分区是解析磁盘的方式,主要解析partition table;而文件系统是解析磁盘数据的方式, ...
xv6-九
前言这篇博客研究xv6的文件系统机制
文件系统总览文件系统是用来管理持久型数据的子系统。由于其需要解决很多问题,所以其抽象层次非常复杂,如下所示
另一方面,文件系统也被称为on-disk data structure,其需要在磁盘中以一定的数据结构进行组织,从而可以让操作系统高效的将文件系统导出到磁盘或从磁盘导入到内存中,如下所示
Disk Layer设计Disk Layer用于抽象对磁盘的读写一般情况下,操作系统通过对磁盘的端口寄存器进行读写,从而完成对磁盘状态的控制和数据的读写。这也就是驱动
由于现实中有各种各样的磁盘,从而需要各种各样的驱动程序。为了隐藏这些实现细节,则通过Disk Layer将其抽象成统一的接口,即名称相同的函数指针在驱动初始化时,将这些指针覆盖为驱动自己的函数。之后调用这些统一的接口,则相当于直接调用这些驱动的函数,从而将不同的驱动实现统一为了相同的接口
实现由于目前xv6仅仅涉及到QEMU的virtio disk设备,因此其仅仅实现了位于kernel/virtio_disk.c的该设备的驱动函数virtio_disk_rw(),并将其当做Disk Layer ...
LinuxFoundation mentorship
IntroduceMy name is Jiawei Hawkins, and I am in my second year for my master school life. I am really appreciated for being selected to participate in the Linux kernel Bug Fixing Summer 2022. This mentorship is really a good oppotunity to join the linux kernel community, I also have a much deeper understanding on linux kernel by analysing linux kernel bug.
what I LearnedTo be honest, I am really confused at the beginning of this mentorship. I only have little knowledge about linux kernel, I even ...
xv6-八
前言这篇博客研究xv6的锁机制
lock原因lock的一个最重要的应用场景——解决条件竞争条件竞争,即多个CPU并行的访问同一块内存,并且至少有一个执行写操作。当条件竞争出现时,往往会发生写入丢失或读取未完全更新的数据事件,从而引发更严重的bug。
而lock可以很好的避免条件竞争。lock可以确保互斥性,即确保同一时间只有一个进程访问临界区(可能被并行执行的部分)资源,从而根本上避免了不完整更新引发的bug。
lock机制一般来说,内核会提供两类lock——spinlock(自旋锁)和sleeplock(信号量)spinlock一般用于短时的互斥(关闭中断响应);而sleeplock往往用于长时的互斥
自旋锁xv6的自旋锁依赖于C标准库的__sync_lock_test_and_set函数,其在riscv底层通过amoswap(Atomic Memory Operations swap)实现。其通过互斥的设置和访问共享变量,从而根据获取的旧值来判断当前自旋锁状态,如下所示123456789101112131415161718192021222324252627282930313233 ...
xv6-七
前言这篇博客研究xv6的进程调度机制的实现
多进程现代操作系统基本都支持并行多进程(多CPU多进程),而要实现该功能,需要解决如下问题
如何切换进程?虽然实现思路不是很难,但是实现细节比较复杂。
如何对用户进程透明?即用户进程应该对于进程切换无感——进程切换前和进程切换后,进程的上下文不应有任何改变
如何找到当前CPU执行的进程的描述符?进程可能被切换到任何CPU上,则CPU应当可以高效的找到当前执行的进程的描述符信息,从而在S-mode时更改当前进程的状态信息
进程切换xv6的进程切换的基本流程如下图所示
可以看到,xv6实现进程切换的方式非常标准——首先从U-mode陷入到S-mode(系统调用或中断),再从对应的S-mode切换到CPU切换进程(每个CPU在操作系统初始化时的执行流)。
接着就是上述步骤的反向操作,即切换到调度出的待切换进程的S-mode,然后从S-mode返回到U-mode,最终完成进程切换
进程调度时,进程首先陷入到S-mode,根据前面xv6-二可知,U-mode的上下文会保存在S-mode的内核栈中;当进程切换结束时,会从S-mode返回到U-mode ...