xv6
  • 2024-09-28xv6踩坑笔记
    lazyallocationtestpgbug:FAILED在系统调用函数(如sys_pipe)中,检测到致命错误(例如访问非法内存)时,不能直接用p->killed=1,而是要return-1。mmapscause0x000000000000000d(loadpagefault)sepc=0x0000000080007bb0stval=0x0000000000000000PANIC:kerneltrapgdb调试
  • 2024-07-23【xv6】xv6源码调试环境搭建
    1.xv6源代码下载gitclonehttps://github.com/ytcoode/xv6.git2.编译并在qemu中运行xv6镜像2.1安装qemusudoapt-getinstallqemu2.2编译并运行xv6将54行QEMU前面的#号注释掉然后直接在当前目录下执行makeqemu即可直接加载并运行xv6镜像手动运行:qemu-syste
  • 2024-07-17操作系统实验四 文件管理
    实验目的与要求:   实验目的:(1)、掌握计算机操作系统管理进程、处理机、存储器、文件系统的基本方法。(2)、了解进程的创建、撤消和运行,进程并发执行;自行设计解决哲学家就餐问题的并发线程,了解线程(进程)调度方法;掌握内存空间的分配与回收的基本原理;通过模拟文件管理的工作
  • 2024-07-17操作系统综合实验二
    实验目的与要求:   实验目的:(1)、掌握计算机操作系统管理进程、处理机、存储器、文件系统的基本方法。(2)、了解进程的创建、撤消和运行,进程并发执行;自行设计解决哲学家就餐问题的并发线程,了解线程(进程)调度方法;掌握内存空间的分配与回收的基本原理;通过模拟文件管理的工作
  • 2024-04-16MIT6.S081 - Lab1: Xv6 and Unix utilities
    Part1:sleep实验要求与提示可以参考user/echo.c,user/grep.c和user/rm.c文件如果用户忘记传递参数,sleep应该打印一条错误消息命令行参数传递时为字符串,可以使用atoi函数将字符串转为数字使用系统调用sleep,有关实现sleep系统调用的内核代码参考kernel/sysproc.c(
  • 2024-04-16xv6代码执行流
    xv6代码执行流xv6executionflowCreated:2024-01-08T19:56+08:00Publish:2024-04-16T10:10+08:00Categories:OperatingSystem基于git://g.csail.mit.edu/xv6-labs-2020代码前置知识:编译原理,计算机组成poe.com:一个gpt网站一个方便的在线查看汇编网站:CompilerExpl
  • 2024-04-01[os]xv6系列学习计划
    选了个劳什子OS课,想着弥补一下本科的时候没写成uCore的遗憾,结果感觉是给自己纯纯找事情做了。开课的时候说是读xv6源码,结果后来发现是上课讲专题,作业读源码,然后写lab(结果还是judge),后来又多了看ostep的作业。只能说每周跟着把ostep重温一遍,同时把xv6的lab写了,然后写点笔记加强记忆
  • 2024-02-14【XV6】 mmap
    代码:https://github.com/JasenChao/xv6-labs.git文件映射到进程地址题目要求实现两个系统调用:mmap和munmap。主要功能就是将文件映射到进程的内存中。题目给出了mmap和munmap的声明:void*mmap(void*addr,size_tlen,intprot,intflags,intfd,off_toffset)
  • 2024-02-14【XV6】 Xv6 and Unix utilities
    代码:https://github.com/JasenChao/xv6-labs.git运行xv6实验环境使用的是Ubuntu20.04,需要安装一些工具:sudoapt-getinstallgitbuild-essentialgdb-multiarchqemu-system-miscgcc-riscv64-linux-gnubinutils-riscv64-linux-gnu安装完成后验证qemu是否安装成功,成功的话
  • 2024-02-14【XV6】 page tables
    代码:https://github.com/JasenChao/xv6-labs.git快速获取pid-ugetpid题目要求参考已实现的ugetpid()使用USYSCALL快速获取pid。实现的思路是在每一个进程中增加一个共享页面,通过USYSCALL指定的虚拟地址,找到指定的页面。参考进程中的Trampoline页和Trapframe页。Trampoline页保
  • 2024-02-14【XV6】 system calls
    代码:https://github.com/JasenChao/xv6-labs.git使用GDB调试安装risc-v的GDB先安装依赖:sudoapt-getinstalllibncurses5-devpython2python2-devtexinfolibreadline-dev再下载源码,可以从清华镜像源下载:wgethttps://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/gdb-13.2.ta
  • 2024-02-14【XV6】 Multithreading
    代码:https://github.com/JasenChao/xv6-labs.git用户级线程切换题目要求完成用户级线程系统,提示程序要在uthread.c和uthread_switch.S中补充完成。用户级线程调度和进程的机制是类似的,因此uthread_switch.S可以复制swtch.S中的内容: .globlthread_switchthread_switch:
  • 2024-02-14【XV6】 traps
    代码:https://github.com/JasenChao/xv6-labs.gitbacktrace题目要求实现backtrace来对堆栈上调用发生错误的地方进行跟踪。寄存器s0包含指向当前堆栈帧的指针,那么返回地址就位于帧指针的固定偏移量-8,前一个fp地址的偏移量为-16。在riscv.h文件中增加提示中的代码:staticinline
  • 2024-02-14【XV6】 file system
    代码:https://github.com/JasenChao/xv6-labs.git支持大文件XV6目前只支持268个blocks大小的文件,一个block(BSIZE)为1024,文件块inode包含12个一级地址和1个二级地址,二级地址指向另一个block,其中存放了256个一级地址,因此一共是268个。题目要求支持大文件(65803个blocks),提示通过三级
  • 2024-02-14【XV6】 locks
    代码:https://github.com/JasenChao/xv6-labs.git内存分配器单个空闲内存列表可能引起多个CPU的频繁锁争用,题目要求设计内存分配器,让每个CPU维护一个空闲内存列表,不同CPU的分配和释放可以并行执行,但如果一个CPU可用列表为空,而其他CPU可用列表不为空,则这个CPU必须窃取其他CPU的空
  • 2024-02-14【XV6】 networking
    代码:https://github.com/JasenChao/xv6-labs.gitE1000网络设备驱动题目已经在kernel/e1000.c中给出了E1000的初始化函数和发送接收函数,要求完善发送和接收的功能。其他相关的代码,上层的网络协议在kernel/net.c和kernel/net.h中。PCI总线上搜索网卡的代码在kernel/pci.c中://t
  • 2024-02-11[MIT 6.S081] Lab: Copy-on-Write Fork for xv6
    Lab:Copy-on-WriteForkforxv6在这个实验中,我们要为xv6实现cowfork。Implementcopy-onwrite根据写时复制的方式,我们在复制页面的时候应该采用的是将父级的物理页面映射到子级的页面,因此我们需要修改kernel/vm.c中的uvmcopy,将页面复制修改为映射的方式,同时应当将
  • 2024-02-06MIT 6.1810 Lab: Copy-on-Write Fork for xv6
    lab网址:https://pdos.csail.mit.edu/6.828/2022/labs/cow.htmlxv6Book:https://pdos.csail.mit.edu/6.828/2022/xv6/book-riscv-rev3.pdfImplementcopy-on-writefork这部分需要我们实现写时拷贝,题目给出解决方案为,当fork时,将父子进程的页表项都设置为只度,当发生写错误时,在处
  • 2024-01-21[MIT 6.S081] Lab: Xv6 and Unix utilities
    Lab:Xv6andUnixutilitiesGradesleepsleep格式如下sleep5这边需要使用kernal/stat.h中的sleep系统调用,并将参数转化为传入。#include"kernel/types.h"#include"kernel/stat.h"#include"user/user.h"intmain(intargc,char*argv[]){if(
  • 2023-12-23xv6 磁盘中断流程和启动时调度流程
    本文讲述xv6中的一些细节流程,还有对之前文中遗留的问题做一些补充说明,主要有以下几个问题:一次完整的磁盘中断流程进入调度器后的详细流程sched函数中的条件判断scheduler函数中为什么要周期性关中断一次完整的磁盘流程此节讲述完整的磁盘读写流程,读写的流程总体差不多,这里以读
  • 2023-12-09xv6 想到什么记什么
    xv6不同视频里安装了不同版本两个我都装了一个是xv6-public点进去是深大视频里配套的i386arch另一个是xv6risc-V就是另一个我参考的视频里 运行xv6用的QEMU是个linux上的模拟器xv6又是个unix变体简易版系统所以最终说起来这个系统是一个程序,跑在一个模拟器程序里,模
  • 2023-12-09xv6 start
    操作系统必须满足三个要求:多路,隔离,交流。用户模式和管理模式强隔离要求应用程序和操作系统之间有一个硬边界。如果应用程序出错,我们不希望操作系统失败或其他应用程序出错,相反操作系统应该能够清理失败的应用程序并继续运行其他应用程序。为了实现强隔离,操作系统必须安排应用程
  • 2023-12-06xv6 mmap
    inlinux调用mmap,会申请一段内存空间(文件的内存映射部分),并且自动映射到指定的文件内存映射部分。mmapvoid*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset);addr为用户指定的内存起始地址,为0时由系统分配。length制定映射的长度,单位是字节。
  • 2023-12-04xv6 file system
    xv6filesystem在我看来文件系统某种程度上是最复杂的一部分(单从页数也足以说明了),而且我对文件系统的了解其实很少,因此这部分仔细看了一下。xv6文件系统提供类似unix的文件、目录和路径名,并将其数据存储在virtio磁盘上以实现持久化。文件系统解决了几个挑战:文件系统需要
  • 2023-12-03xv6 cow
    虚拟内存提供了一定程度的间接性:内核可以通过将PTE标记为无效或只读来拦截内存引用,从而导致页面错误,并可以通过修改PTE来更改地址的含义。xv6中的fork系统调用将父进程的所有用户空间内存复制到子进程中。如果父对象很大,则复制可能需要很长时间。更糟糕的是,这项工作经常被大量浪