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 ...
xv6-六
前言这篇博客研究xv6的Copy-on-Write机制的实现
Lab Copy-on-Write Fork for xv6本次lab用来实现xv6的Copy-on-Write机制
Copy-on-Write要求
Your task is to implement copy-on-write fork in the xv6 kernel. You are done if your modified kernel executes both the cowtest and usertests programs successfully.
分析Copy-on-Write和lazy allocation非常类似,都是为了节省直接分配导致的性能损失,从而推迟实际的physical page的分配和映射,仅仅完成virtual page的分配。
其中,Copy-on-Write是在进程fork时,仅仅复制父进程的pd(页表),而共享实际的physical page,从而节省了physical page的分配和内容的复制。而实际的页框(physical page)分配,延迟到父进程或子进程执行 ...
xv6-五
前言这篇博客研究lazy page allocation机制
lazy page allocation一个操作系统中可以包含多个进程,进程的地址空间所占用的虚拟地址空间之和一般远远大于实际的物理内存之和。
因此,一般操作系统通过通过如下几种方法,将进程的超大的虚拟地址空间映射到有限的物理地址空间中
不同虚拟内存映射相同物理内存实际上,不同进程或相同进程的不同虚拟内存有很大一部分包含相同的数据(linux的glibc库, 内核的stack0数据)。因此,完全可以将这些虚拟内存指向相同的物理地址
延迟分配往往进程会申请超过实际需要的内存,并且申请后不会立即使用。因此,当进程申请内存时,仅仅分配虚拟内存并记录在描述符中,但是并不实际分配物理内存并映射。也就是此时并不消耗物理内存。当进程真正访问该虚拟内存时,会产生page fault,从而在异常处理时完成实际的映射即可
Lab lazy allocation本次lab帮助熟悉xv6的lazy allocation机制
Lazy allocation要求
Modify the code in trap.c to respond to a p ...
xv6-四
前言这篇博客探索一下xv6从U-mode地址空间trap(陷入)到S-mode地址空间的机制(前面xv6-二已经介绍的非常详细了)
Lab traps本次lab帮助熟悉xv6的trap(陷入)机制
Backtrace要求
Implement a backtrace() function in kernel/printf.c. Insert a call to this function in sys_sleep, and then run bttest, which calls sys_sleep. Your output should be as follows:
1234backtrace:0x0000000080002cda0x0000000080002bb60x0000000080002898
After bttest exit qemu. In your terminal: the addresses may be slightly different but if you run addr2line -e kernel/kernel (or riscv64-unknown- ...