- 博客(23)
- 收藏
- 关注
原创 MIT6.828_LAB6_Part B: Receiving packets and the web server Receiving Packets
Part B: Receiving packets and the web server Receiving Packets正如你构建发包功能的过程一样,你还得配置E1000来接受数据包,并且提供一个接收描述符队列和接收描述符,3.2节描述了数据包接收的过程,包括接收队列的结构和接收描述符,初始化过程的细节在14.4章节。练习9.阅读3.2节,你可以无视关于中断和checksum offloading的所有部分(你在后面决定要用这些功能时可以回顾这些部分),你无需关注临界值和内部缓冲如何工作的细节。接
2020-09-21 14:54:56 305
原创 MIT6.828_LAB6_Part A: Initialization and transmitting packets
Lab 6: Network DriverIntroduction本实验室默认能自主完成的最后一个项目,现在我们已经有了一个文件系统,本实验中我们将为网卡接口编写驱动程序,该卡基于Intel 82540EM芯片,也称为E1000。Getting Started但是,网卡驱动程序还不足以使JOS连接到Internet。 在新的lab6代码中,我们为您提供了网络堆栈和网络服务器。 与以前的实验一样,使用git获取该实验的代码,合并到您自己的代码中,并浏览新目录net中的内容以及kern /中的新文件。
2020-09-18 11:05:58 400
原创 MIT6.828_LAB5_File system, Spawn and Shell
Lab 5: File system, Spawn and ShellIntroduction本节中,我们将实现spawn,一个能够加载并运行硬盘上可执行文件的库调用,之后会扩招我们的jos内核和操作系统库使其能在控制台上运行shell,这些功能需要文件系统支持,本实验会介绍一个简单的读/写文件系统。Getting Started使用git获取并切换到分支lab5athena% cd ~/6.828/labathena% add gitathena% git pullAlready up-
2020-09-08 17:58:44 405
原创 MIT6.828_HW11_xv6 log
Homework: xv6 log本节中我们将在两个部分探索xv6的日志系统,首先我们要人为地创建一个crash来说明为什么需要日志,第二,我们要删除xv6日志系统中一个效率低的部分。Creating a Problemxv6日志的要点是使所有可能产生崩溃的文件系统操作都是原子的。 例如,文件创建涉及向目录添加新条目以及将新文件的inode标记为使用中。 如果没有日志,则在重新启动后,在一个之后但在另一个之前发生的崩溃将使文件系统处于不正确的状态。以下步骤将破坏日志记录代码,使文件部分创建。首先,
2020-09-05 17:46:16 341
原创 MIT6.828_HW10_Bigger files for xv6
Homework: bigger files for xv6本节中,我们将增加xv6文件的最大尺寸,xv6的i节点包含12个直接索引节点和一个一级索引节点,因此当前的xv6文件大小限制在512/4=128+12=140个扇区即71680个字节,我们要修改xv6文件系统的代码位每个i节点添加一个二级索引节点,二级索引节点指向的索引块包含128个一级索引节点,每个一级索引节点包含128个条目,每个条目指向一个数据块,这样一个文件的大小限制将拓展到11+128+2^14=16523个扇区(约8.5M)。建议阅读
2020-08-28 17:20:26 1473
原创 MIT6.828_HW9_Barriers
Barriers本节中我们将利用pthread库提供的条件变量来实现一个barrier,barrier指一个应用程序点,必须在所有线程都到达该点后,线程才能继续执行。条件变量类似xv6中的sleep和wakeup,也是一种序列同步技术。首先下载barrier.c并在机器上进行编译$ gcc -g -O2 -pthread barrier.c$ ./a.out 2Assertion failed: (i == t), function thread, file barrier.c, line 55
2020-08-27 21:07:50 540 1
原创 MIT6.828_HW8_User-level threads
Homework: User-level threads在此作业中,您将通过实现代码来执行线程之间的上下文切换,从而完成一个简单的用户级线程包。Switching threads下载utherad.c和uthread_switch.S 到你的xv6目录,并在xv6Makefile中_forktest之后添加如下规则:_uthread: uthread.o uthread_switch.o$(LD) $(LDFLAGS) -N -e main -Ttext 0 -o _uthread uthrea
2020-08-26 16:22:32 495
原创 MIT6.828_LAB4_Part C_Preemptive Multitasking and Inter-Process communication (IPC)
Part C: Preemptive Multitasking and Inter-Process communication (IPC)In the final part of lab 4 you will modify the kernel to preempt uncooperative environments and to allow environments to pass messages to each other explicitly.在Lab4的最后一部分,我们将修改内核来实现抢占式
2020-08-22 20:36:42 386
原创 MIT6.828_LAB4_PartB_Copy-on-Write Fork
Part B: Copy-on-Write Fork正如先前所提到的,Unix提供了fork()系统调用作为创建进程原语,fork()会将父进程的地址空间复制来创建一个子进程。xv6 Unix通过将父进程所有页的数据复制到新分配给子进程的页上实现了fork(),实际上dumbfork()中也采用了相同的方法,复制父进程的地址空间到子进程是fork()操作中开销最大的部分。但是,在子进程中fork()之后通常紧接着是对exec()的调用,新程序会替换掉子进程的内存。 这就是shell程序通常所做的事情。
2020-08-22 02:02:44 419
原创 MIT6.828_Lab4_PartA_Multiprocessor Support and Cooperative Multitasking
Lab 4: Preemptive Multitasking简介本次实验我们将要实现在多并发进程的情况下实现抢占式多任务,在PartA中,将为JOS提供多处理器支持,实现循环调度,并添加基本的进程管理系统调用(创建和销毁环境以及分配/映射内存的调用)。在PartB中,将实现一个类Unix的fork(),它允许用户进程创建子进程。最后,在PartC中,将提供对进程间通信(IPC)的支持,从而允许不同的用户进程进行通信和同步。 还将添加对硬件时钟中断和抢占的支持。预备工作:首先按课程提示提交lab3代码然
2020-08-20 02:29:42 514
原创 MIT6.828_HW7_xv6 locking
Homework: xv6 locking本节,我们将探索中断与锁机制的一些互相作用的情况Don’t do this弄清楚如果xv6内核执行下列这段代码,会发生什么?struct spinlock lk;initlock(&lk, “test lock”);acquire(&lk);acquire(&lk);先阅读一下spinlock.cacquire函数:holding函数:为什么会发生panic的情况?答:根据代码逻辑可以知道,当前cpu已经获取了
2020-08-14 17:01:40 503
原创 MIT_6.828_HW6_Threads and Locking
Homework: Threads and Locking本节中,我们将使用哈希表来探索线程和锁的并行编程,这个任务应该在一个具有多核的真实的计算机上运行(而非xv6或QEMU)Step1:下载https://pdos.csail.mit.edu/6.828/2018/homework/ph.c(ph.c)并在计算机上使用如下指令进行编译:$ gcc -g -O2 ph.c -pthread$ ./a.out 2参数2指出会有2个线程对哈希表进行get和put操作,程序运行一段时间后,会打印出
2020-08-13 16:14:13 560
原创 MIT6.828_Lab3_PartB_Page Faults, Breakpoints Exceptions, and System Calls
Part B: Page Faults, Breakpoints Exceptions, and System Calls现在,JOS具有了基本的异常处理功能,我们将对其进行优化,以提供用于处理异常或中断的重要操作系统原语。处理页面故障页面错误异常(T_PGFLT)是一个特别重要的异常,当处理器发生页面故障时,引起故障的线性(即虚拟)地址会被存储在特殊的处理器控制寄存器CR2中。在trap.c中,我们提供了一个函数page_fault_handler()(仅编写了开头的代码),用于处理页面错误异常。
2020-08-12 18:44:13 367
原创 MIT6.828_Lab 3_User Environments_Part A
Lab 3: User Environments简介:本实验中将实现运行受保护的用户态环境(即“进程”)所需的基本内核功能。 将增强JOS内核,以设置数据结构来跟踪用户环境(进程),创建单个用户环境(进程),将程序映像加载到其中并开始运行。还将使JOS内核能够处理用户环境(进程)发出的任何系统调用并处理它引起的任何其他异常。注意:在本实验中,术语“环境”和“过程”是可互换的-两者均指允许您运行程序的抽象。 为了强调JOS环境和UNIX进程提供不同的接口,并且不提供相同的语义,我们引入术语“环境”
2020-08-11 19:53:54 487
原创 MIT6.828_HW5_ XV6 CPU Alarm
Homework: xv6 CPU alarm本次练习将向xv6添加一项功能,该功能会在使用CPU时间的情况下定期向进程发出警报。 这对于想要限制消耗CPU时间的计算密集型进程很有用,或者对于想要占用CPU但还想采取一些定期操作的进程很有用。 更一般的说,本练习将实现用户级中断/故障处理程序的原始形式。首先应该添加一个新的alarm(interval, handler)系统调用。 如果应用程序调用alarm(n,fn),则在程序消耗的CPU时间每到达n次“tick”之后,内核将导致应用程序函数fn被调
2020-08-07 23:47:07 680
原创 MIT6.828_HW4_ XV6 Lazy Page Allocation
Homework4: xv6 lazy page allocationXv6应用程序使用sbrk()系统调用向内核请求堆内存,sbrk()分配物理内存并将其映射到进程的虚拟地址空间。 有些程序分配内存,但从不使用它,例如大型稀疏数组。 复杂的内核会延迟分配内存的每个页面,直到应用程序尝试使用该页面为止(产生缺页中断时),本练习中我们会将此延迟分配功能添加到xv6。Part One: Eliminate allocation from sbrk()第一个任务是删除sbrk(n)系统调用中分配内存的核心代
2020-08-06 15:18:59 1266 1
原创 MIT6.828_HW3_XV6 System Call
Part One: System call tracing第一个任务是修改xv6内核syscall.c中的代码,使其能够为每个系统调用都能输入如下格式的跟踪信息,跟踪信息由系统调用名称和系统调用返回值组成,格式如下:首先建立一个数组保存系统调用号和系统调用名称的映射关系,然后修改syscall函数即可,curproc->tf->eax首先保存系统调用号,在执行系统调用后保存该系统调用的返回值,修改后的代码如下图:可选挑战:修改syscall函数使其能打印系统调用的参数思路:eps后
2020-08-05 14:42:18 1188
原创 MIT6.828_Lab2_Part3
Part3:内核地址空间JOS将32位线性空间分成两部分,以ULIM符号为界限,ULIM以上的部分由内核完全控制,用户层没有权限访问,除了为内核保留的堆栈等空间之外,ULIM以上还为内核预留了大约256M的虚拟地址空间,[UTOP,ULIM)的区域用于保存某些对用户层公开的内核数据结构,例如pageinfo结构体,UTOP下方的部分供用户层使用,这部分的访问权限由用户层环境设置。根据上面的描述,参考memlayout.h,我们要补充pmap.c中的mem_init函数来设置合适的线性地址到物理地址的映射
2020-08-03 16:26:52 259
原创 MIT6.828_LAB2_Part2
Part 2: Virtual Memory在做实验的第二部分之前,课程建议我们仔细阅读Intel 80386 Reference Manual的5.2和6.4小结,熟悉页转换和页保护的相关知识,并且基本了解分段的相关知识。一.分页相关知识:1.仅当寄存器CR0的PG位被设置时,开启分页机制,该位由操作系统在软件初始化时设置2.页帧:4K大小的地址连续的物理内存3.线性地址格式:DIR为页目录表索引,PAGE为页表索引,OFFSET为页内偏移量4.线性地址转物理地址过程启用分页前,页目录所
2020-08-01 13:29:49 262
原创 MIT_6.828_LAB2_Part1
LAB2:内存管理1.简介本实验中,我们将为操作系统编写内存管理代码,内存管理包括两个部分,第一个部分是内核的物理内存分配器,它能让内核得以分配和释放物理内存,编写的分配器应以4096字节(一页)为一个操作单位,我们的任务是维护一个数据结构,记录哪些物理页是空闲的,哪些是已分配的,以及共享每个已分配页面的进程数,我们还要编写分配和释放内存页面的例程。内存管理的第二个部分是虚拟内存,它将内核和用户软件使用的虚拟地址映射到物理内存上,当指令使用内存时,x86硬件的内存管理单元(MMU)执行映射,查询一组页表
2020-07-31 16:10:14 293
原创 MIT6.828_HW2_SHELL
Homework: shell1.预备知识:1.XV6讲义P7-P142.源码中部分常用函数的了解:3.文件描述符:在xv6内核中,每个进程都有一张文件描述符表,表项描述了文件的各种信息,一个表项对应一个文件,文件描述符即是文件在表中对应表项的下标,进程通过文件描述符对文件进行读写等各种操作,按照约定,进程一般通过标准输入文件(fd=0)读取数据,对标准输出文件(fd=1)进行写操作,将错误信息输出到标准错误文件(fd=2)上,并且这三个文件描述符默认都是打开状态,通过利用这些约定,使用clos
2020-07-31 15:12:07 401
原创 MIT6.828_HW1_Boot xv6
Homework1: boot xv61.Finding and breaking at an address在linux下通过nm kernel | grep _start命令找到内核程序的入口,并在此处(0x0010000c)打上断点,之后执行qemu-gdb,并打开一个新终端,进入同一个目录下,执行gdb命令进行调试,此处如果gdb调试报程序未运行的错误的话,需要在用户目录下的.gdbinit文件中(如果找不到该文件,新建一个即可)添加add-auto-load-safe-path /home/x
2020-07-31 15:04:27 296
原创 MIT_6.828_LAB1
一、环境搭建首先我们需要搭建好环境,主要包括以下步骤:1.安装VMware15并安装虚拟机Ubuntu2.安装git 和python3.根据MIT课本测试/安装工具链4.克隆并安装qemu及相关依赖包4.克隆编译jos系统并加载具体操作步骤可以参考MIT6.828课程实验环境搭建MIT 6.828 环境配置二、预备知识在开始实验前,建议积累下列知识,有助于顺利地进行后续练习.1.对X86(AT&T语法)汇编语言的初步了解参考资料: 6.828_X86参考资料或者 X86汇
2020-07-31 15:02:53 1243
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人