![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MIT6.828操作系统学习
请叫宝宝荡哥
这个作者很懒,什么都没留下…
展开
-
MIT6.828学习之homework1:Boot xv6
因为搞不太清楚栈内的变化,所以我花了超大功夫,从0x7c00 (the boot loader 开始)一步一步观察,直到0x0010000c (内核开始),只是我没想到,这中间居然有将近5万条指令,着实让我震惊!断点设在br *0x0010000c,可以看到如下信息:通过我的实验可以知道0x7c00:8ec031fa是执行完movl $start, %esp后的结果,我认为这是栈的开始0...原创 2019-07-08 11:54:08 · 835 阅读 · 1 评论 -
MIT6.828学习之homework6:Threads and Locking
parallelism(并行性)在本作业中,您将使用a hash table(哈希表)研究threads and locks的并行编程。您应该在具有多个核心的真实计算机(不是xv6,也不是qemu)上完成这项作业。在自己的操作系统上使用下面命令$ gcc -g -O2 ph.c -pthread$ ./a.out 22指定在哈希表上执行put和get操作的线程数。结果如下:每个线程...原创 2019-07-26 16:51:14 · 2209 阅读 · 0 评论 -
MIT6.828学习之Lab3_Part A: User Environments and Exception Handling
参考全局描述符GDTenv structure介绍struct Env { struct Trapframe env_tf; // Saved registers 以便恢复现场 struct Env *env_link; // Next free Env envid_t env_id; // Unique environment identifier 唯一标识 envid_t...原创 2019-07-23 08:58:16 · 2031 阅读 · 2 评论 -
MIT6.828学习之homework7:xv6 locking(confused!)
在本作业中,您将探索 interrupts 和locking之间的一些交互Don’t do this确保您理解如果xv6内核执行以下代码片段会发生什么:struct spinlock lk;initlock(&lk, "test lock");acquire(&lk);acquire(&lk);(请随意使用QEMU查找. acquire 处于spinlock...原创 2019-07-27 11:34:21 · 1654 阅读 · 0 评论 -
MIT6.828学习之Lab4_Part B: Copy-on-Write Fork
如之前提到的,Unix提供了fork()系统调用作为其主要的进程创建原语。fork()系统调用将调用者进程(父进程)的地址空间复制到一个新创建的进程(子进程)。xv6 Unix 通过复制父进程物理页所有数据到分配给子进程的物理页。dumbfork()也是这么做的。将父地址空间复制到子地址空间是fork()操作中开销最大的部分。然而,调用fork()后几乎里面会在子进程中调用一个exec(),它...原创 2019-08-08 10:23:50 · 1106 阅读 · 1 评论 -
MIT6.828学习之homework10:bigger files for xv6
在这个作业中,您将增加xv6文件的最大大小。目前,xv6文件被限制在140个扇区,即71,680字节。这个限制来自于一个xv6 inode包含12个“直接”块号("direct" block number)和一个“单间接”块号("singly-indirect" block number),这个块号指的是一个最多可以容纳128个块号的块,总数为12+128=140。您将更改xv6文件系统代码,使每...原创 2019-08-13 21:21:06 · 1989 阅读 · 1 评论 -
MIT6.828学习之Lab4_Part C: Preemptive Multitasking and Inter-Process communication (IPC)
在lab 4的最后一部分中,您将修改内核以抢占不合作的环境,并允许环境之间显式地传递消息。原创 2019-08-09 12:26:45 · 904 阅读 · 0 评论 -
MIT6.828学习之Lab4: Preemptive Multitasking
在这个lab中,你会在多个同时active的用户模式环境中实现preemptive multitasking(抢占多任务处理)在Part A,你会向JOS加入multiprocessor support(多处理器支持),实现round-robin scheduling(轮转调度),并且添加基础的environment management system calls(这个调用能创建和destroy...原创 2019-08-09 17:29:56 · 1017 阅读 · 0 评论 -
MIT6.828学习之homework8:User-level threads
多路复用机制为进程提供了独占处理器的假象,实现多路复用有几个难点。首先,应该如何从运行中的一个进程切换到另一个进程?xv6 采用了普通的上下文切换机制;虽然这里的思想是非常简洁明了的,但是其代码实现是操作系统中最晦涩难懂的一部分。第二,如何让上下文切换透明化?xv6 只是简单地使用时钟中断处理程序来驱动上下文切换。第三,可能出现多个 CPU 同时切换进程的情况,那么我们必须使用一个带锁的方案来避免...原创 2019-08-10 19:12:15 · 549 阅读 · 0 评论 -
MIT6.828学习之homework11:xv6 log
本作业分两部分研究xv6日志。首先,您将人为地创建一个崩溃(crash),说明为什么需要日志记录(logging)。其次,您将消除xv6日志系统中的一个低效。Creating a Problemxv6日志的目的是使文件系统操作的所有磁盘更新相对于崩溃(crashes)来说都是原子性的。例如,文件创建包括向目录添加新条目和将新文件的inode标记为in-use。如果没有日志记录,则在一个崩溃之后...原创 2019-08-24 09:28:01 · 672 阅读 · 0 评论 -
MIT6.828学习之homework9:Barriers
在本作业中,我们将探讨如何使用pthread库提供的条件变量来实现barrier。barrier是应用程序中的一个点,在这个点上,所有线程都必须等待,直到所有其他线程也到达该点。条件变量是一种序列协调技术,类似于xv6的sleep和wakeup。下载barrier.c,然后在你的手提电脑或Athena machine上编译:$ gcc -g -O2 -pthread barrier.c$ ....原创 2019-08-12 11:55:37 · 1018 阅读 · 0 评论 -
MIT6.828学习之Lab5_实验过程
Introduction在这个实验室中,您将实现spawn,一个加载并运行磁盘上可执行文件的库调用。然后,您将充实内核和库操作系统,使其足以在控制台上运行shell。这些特性需要一个文件系统,本实验室介绍了一个简单的读/写文件系统。实验室这部分的主要新组件是位于新fs目录中的文件系统环境。浏览此目录中的所有文件,了解其中的新内容。此外,在user和lib目录中还有一些与文件系统相关的新源文件:...原创 2019-08-23 08:47:58 · 3607 阅读 · 0 评论 -
MIT6.828学习之Lab5:File system, Spawn and Shell
File system preliminaries(序言)您将使用的文件系统比大多数“实际”文件系统(包括xv6 UNIX)要简单得多,但是它的功能足够强大,可以提供基本特性:创建、读取、写入和删除按层次(hierarchical )目录结构组织的文件。我们(至少目前)只开发一个单用户操作系统,它提供了足够的保护来捕获bug,但不能保护多个相互怀疑的用户。因此,我们的文件系统不支持UNIX文件...原创 2019-08-22 22:24:43 · 1349 阅读 · 0 评论 -
MIT6.828学习之Lab6_Part A: Initialization and transmitting packets
您的内核没有时间概念,所以我们需要添加它。目前有一个时钟中断,每10ms由硬件产生一次。在每个时钟中断时,我们可以增加一个变量来表示时间已经提前了10ms。这是在kern/time.c中实现的,但尚未完全集成到内核中。Exercise 1. 为kern/trap.c中的每个时钟中断添加对time_tick的调用。实现sys_time_msec并将其添加到kern/syscall.c中的sysc...原创 2019-08-30 21:56:59 · 675 阅读 · 0 评论 -
MIT6.828学习之Lab6_Part B: Receiving packets and the web server
Receiving Packets就像您在transmitting packets时所做的一样,您必须配置E1000来接收数据包,并提供receive descriptor queue and receive descriptors。第3.2节描述包接收的工作原理,包括接收队列结构和接收描述符,第14.4节详细介绍了初始化过程。Exercise 9. 阅读3.2节。您可以忽略关于 inter...原创 2019-09-03 17:11:01 · 455 阅读 · 0 评论 -
MIT6.828学习之Lab4_Part A: Multiprocessor Support and Cooperative Multitasking
在本实验室的第一部分中,您将首先将JOS扩展到在多处理器系统(multiprocessor system)上运行,然后实现一些新的JOS内核系统调用,以允许用户级环境创建额外的新环境。您还将实现协作循环调度(cooperative round-robin scheduling),允许内核在当前环境自愿放弃CPU(or exits)时从一个环境切换到另一个环境。在稍后的Part C中,您将实现抢占式...原创 2019-08-03 20:03:12 · 1220 阅读 · 0 评论 -
MIT6.828_Lecture9:Multiprocessors and locking
1.为什么要讨论locking呢?应用程序希望使用多核处理器并行加速因此内核必须处理并行系统调用从而并行访问内核数据(缓存、进程和c) locks有助于正确地共享数据 locks可以限制并行加速2.Locking homeworkrecall: ph.c, multi-threaded has...翻译 2019-07-25 17:20:43 · 256 阅读 · 0 评论 -
MIT6.828学习之Lab2:Memory Management
a physical memory allocator for the kernel。Your allocator will operate in units of 4096 bytes(以4M一页为单位)。record which physical pages are free and which are allocated, and how many processes are sharin...原创 2019-07-12 20:55:23 · 811 阅读 · 0 评论 -
MIT6.828学习之获取MIT6.828远端仓库资源
每做新Lab可能都会要新加一些文件然后把自己之前实验的lab合并进来,那么怎么把文件从MIT6.828的远端仓库里fetch下来,并与之前的合并,就需要这样做:由于之前为了把实验push到自己的远端仓库,不小心把MIT6.828那个给删了,现在得重新加上去,不过远程库的名字不能再使用origingit remote add MIT6.828 https://pdos.csail.mit.edu...原创 2019-07-09 16:00:25 · 1166 阅读 · 0 评论 -
MIT6.828学习之homework2:shell
用到的函数介绍详细介绍原创 2019-07-13 17:12:37 · 3581 阅读 · 2 评论 -
MIT6.828学习之Lab2_Part 1: Physical Page Management
任务:补全这五个函数在同学的帮助下,得到了这样一张图:有这张图之后再来做这部分的练习就会轻松一些。虚拟内存主要的好处是:让每个程序都以为自己独占计算机内存空间,概念清晰,方便程序的编译和装载。通过将部分内存暂存在磁盘上,可以让程序使用比物理内存大得多的虚拟内存,突破物理内存的限制。通过对不同进程设置不同页表,可以防止进程访问其他进程的地址空间。通过在不同进程之间映射相同的物理页,...原创 2019-07-10 20:43:09 · 906 阅读 · 0 评论 -
MIT6.828学习之Lab1
一、补充知识汇编与反汇编汇编语言QEMU模拟器GDB二、实验内容1.2.The Boot Loader学习boot.s,main.c,boot.asm,了解在GDB中执行引导加载程序时发生了什么Exercise 3内容过程use the x/i command in GDB to disassemble sequences of instructions in the bo...原创 2019-07-05 20:43:04 · 6497 阅读 · 5 评论 -
MIT6.828学习之homework5:xv6 CPU alarm
向xv6添加一个功能,当进程使用CPU时间时,该功能会定期发出警报原创 2019-07-18 11:40:45 · 847 阅读 · 2 评论 -
MIT6.828学习之Lab2_Part 2: Virtual Memory
我觉得Part2最关键还是这张图,只有深刻理解了Logical Address经过分段机制转换成Linear Address再经过分页机制转换成Physical Address这个过程以及他们的逆过程,才能顺利完成该部分。当然Lab2只涉及线性地址与物理地址的相互转换。感谢__七把刀__PDE(page directory entry页目录表项)PTE(page table entry页表表...原创 2019-07-11 21:10:29 · 654 阅读 · 0 评论 -
MIT6.828学习之Lab2_Part3:Kernel Address Space
JOS处理器的32位线性地址空间分为两部分,内核控制ULIM分割线以上的部分,为内核保留大约256MB(0xf000000-0xffffffff)的虚拟地址空间,用户环境控制下方部分,约3.72G(0x0-0xef800000)。用户环境将没有对以上ULIM内存的任何权限,只有内核能够读写这个内存;[UTOP,ULIM],内核和用户环境都可以读取但不能写入这个地址范围,此地址范围用于向用户环境公...原创 2019-07-12 16:45:33 · 496 阅读 · 0 评论 -
MIT6.828学习之homework3:xv6 system calls
Part Oneto print the name of the system call and the return value for each system call invocation从syscall()代码中可以看出,系统调用的返回值存在curproc->tf->eax中,直接输出就行,就是这个系统调用名不太好输出,系统调用号可以知道是在num中,根据sysproc.h...原创 2019-07-17 10:38:28 · 2752 阅读 · 1 评论 -
MIT6.828学习之Lab3_Part B: Page Faults, Breakpoints Exceptions, and System Calls
现在由于你的内核有了基本的异常处理能力,你会继续改进它,以提供依赖于异常处理的重要操作系统原语。Handling Page FaultsThe page fault exception, interrupt vector 14(T_PGFLT), 是特别重要的一个,我们将在这个和下一个lab中大量练习它。当处理器收到一个page fault,它将导致错误的linear(或virtual) ad...原创 2019-07-24 11:36:46 · 891 阅读 · 0 评论 -
MIT6.828学习之homework4:xv6 lazy page allocation
xv6应用程序使用sbrk()系统调用向内核请求堆内存。在我们给出的内核中,sbrk()分配物理内存并将其映射到进程的虚拟地址空间。有些程序分配内存,但从不使用它,例如实现大型稀疏数组。复杂的内核会延迟对每个内存页的分配,直到应用程序尝试使用该页面——这是由页面错误发出的信号。就是只修改进程大小值实际上不分配页面(让进程误以为分配了),等需要使用对应页面再来分配Part One修改sbrk(...原创 2019-07-17 16:36:23 · 2511 阅读 · 1 评论 -
80386 Programmer's Manual: Chapter 9 Exceptions and Interrupts(Personal Translation)
Chapter 9 Exceptions and Interrupts1.interrupts are used to handle asynchronous events(异步事件) external to the processor(处理器外部的), but exceptions handle conditions detected by the processor itself in th...翻译 2019-07-19 21:00:09 · 235 阅读 · 0 评论 -
MIT6.828学习之Lab3:User Environments
In this lab you will implement the basic kernel facilities required to get a protected user-mode environment (i.e., “process”) running. You will enhance the JOS kernel to set up the data structures to...原创 2019-07-24 19:52:30 · 1371 阅读 · 0 评论 -
MIT6.828_Lecture 8: Interrupts, System calls, and Exceptions in xv6
1.硬件现在需要关注(attention)! 软件必须搁置当前的工作并做出响应2.为什么hw现在需要关注?MMU无法翻译地址用户程序除0用户程序想要执行内核代码(INT)网络硬件(Network hardware)想要传递一个数据包(deliver a packet)计时器硬件希望提供一个“tick”内核cpu到cpu的通信,例如刷新(flush)TLB (IPI)3.这些 “tr...翻译 2019-07-25 11:53:03 · 257 阅读 · 0 评论 -
MIT6.828学习之Lab6: Network Driver
Introduction这个lab是默认你可以自己做的最后一个项目。既然你有一个文件系统,OS还应该有network stack。在这个lab中,你将为网络接口卡(network interface card)写一个驱动程序。这个card是基于Intel 82540EM芯片,也被称为E1000。Getting Started然而网卡驱动程序(network card driver)并不足以...原创 2019-09-06 22:01:55 · 1092 阅读 · 0 评论