XV6是两级页表,结构如下 页表根是包含4096B的页目录,含1024个PTE(页表项),每个PTE指向一个二级页的PPN(物理地址),在于二级的10bit序号结合之后指向二级页表中的PTE,该PTE包含PPN与最后的offset组合成要访问的PPN,完成寻址过程。 为了节省内存,大部分的虚拟地址不会进行映射,在找不到时会触发缺页中断。 每个PTE包...
XV6学习(二) 第一个进程 XV6-第一个进程 概念 一个抽象,向程序提供貌似私有的内存空间以及CPU资源 为了给每个进程提供独立的进程空间,xv6使用页表将进程的虚拟地址翻译成物理地址(这依赖于硬件MMU) 如上图,XV6的进程地址空间分为用户区和内核区,这样的设计使得系统调用的代码可以直接的访问用户的内存。 启动 XV6的...
XV6 传承了 Unix V6 操作系统内核的设计风格和结构,使用纯 C 语言编写,并运行在RISC-V处理器上。XV6 的代码不多,功能实现地也比较简单,性能和 Linux 也没办法比。但它麻雀虽小五脏俱全,非常适合学习操作系统的资料。在自学 MIT6.S081 这门课前,我虽然对操作系统有着大致的了解,但从未深入了解过它的一些实现...
内核必须在运行时为页表、用户内存、内核栈和管道缓冲区分配和释放物理内存。 xv6使用内核末尾到PHYSTOP之间的物理内存进行运行时分配。它一次分配和释放整个4096字节的页面。 它使用链表的数据结构将空闲页面记录下来。分配时需要从链表中删除页面;释放时需要将释放的页面添加到链表中。 XV6共拥有128MB的内存,内存地址从...
📚XV6是MIT开源的一个学习项目,通过对它的学习,你将能够更深入地理解操作系统的整体概念。即使不将其写入简历,它也是一个非常有价值的学习经历。虽然有人可能会觉得人手一个XV6项目有点过于普遍,但我认为它仍然值得一试。💡在实验中,你可以尝试自己实现一些功能,这对C语言和汇编语言的学习有一定的要求。如果遇...
fork系统调用:通过fork系统调用复制父进程并创建子进程。内存共享优化:XV6允许父子进程共享物理页,通过设置页表项为只读来优化内存使用。当发生trap时,内核会检查并请求实际的物理页分配。同时,通过引用计数管理物理页的生命周期。启动过程:链接脚本与符号位置要求:启动XV6操作系统内核涉及特定的链接脚本和...
xv6操作系统中,进程管理的互斥与同步主要通过锁机制实现,具体答案如下:1. 锁的基本概念与实现 自旋锁:在持有锁的CPU上不断循环等待,直到获取锁。通过关中断和原子赋值操作确保互斥性,使用pushcli和popcli函数控制中断状态,避免在自旋等待过程中被调度。 睡眠锁:在自旋锁的基础上增加了休眠和唤醒...
(注:本文代码中的注释很重要,如看不清,可移步我的个人博客中查看) 在上文(Xv6学习小记(一)——编译与运行)中,我们介绍了Linux下编译运行Xv6系统的方式。 本文将介绍Xv6是如何多核启动的,涉及到的内容有:Xv6多核启动的大致步骤、Xv6检测CPU个数的方法和Xv6发送中断的方法等。 1 多核启动......
XV6学习(9)Lab cow: Copy-on-write fork 代码在github上。总体来说如果理解了COW机制的话,这个实验的完成也没有很复杂。 这一个实验是要完成COW(copy on write)fork。在原始的XV6中,fork函数是通过直接对进程的地址空间完整地复制一份来实现的。但是,拷贝整个地址空间是十分耗时的,并且在很多情况下,程序立即...
XV6学习(一) bootloader的实现 bootloader作用 一句话描述: 加载内核到内存,建立内存空间的映射,将系统的控制权交给内核并且运行,PC的BIOS和bootloader分开了(先BIOS后bootloader),嵌入式一般一起集成到了bootloader 组成 XV6上的bootloader分为bootasm.S与bootmain.c...