xv6-十一
前言这篇博客研究xv6的设备驱动机制
Lab networking本次lab用来实现xv6的E1000(Network Interfact Card)的设备驱动
要求
You’ll use a network device called the E1000 to handle network communication. To xv6 (and the driver you write), the E1000 looks like a real piece of hardware connected to a real Ethernet local area network (LAN). In fact, the E1000 your driver will talk to is an emulation provided by qemu, connected to a LAN that is also emulated by qemu. On this emulated LAN, xv6 (the “guest”) has an IP address of 10.0.2.15. Qe ...
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 ...