MIT 6.828 xv6/jos LAB3-PARTB

这一部分是希望能够处理页错误、断点和系统调用

处理系统页错误

在发生了page fault之后,进入到系统中断中,然后经过_alltraps,进入到trap,再经过trap_dispatch分发,应该对中断类型为T_PGFLT的中断进行处理

当然,页错误也有内核页错误和用户页错误

处理断点

在JOS中,断点中断被“滥用”了,几乎是一种系统调用,用作调用系统的Monitor,实现很简单

系统调用

系统调用的汇编部分已经写好了

引发一个中断,中断号是T_SYSCALL,而具体的系统调用号写在了num中,也就是寄存器ax中,然后在trap_dispatch中,调用syscall就可以了

而syscall的实现如下所示

User-mode startup

在系统启动时刻加载的链接进内核的程序是user/hello.c

就是打印hello world和自己的环境信息

但是这里涉及到好几次的中断和系统调用

第一次调用系统调用sys_getenvid是

然后进入umain函数之后

这里输出了两次,所以会产生两次系统调用

当umain函数执行结束之后,回到Libmain函数,此时会执行exit函数,而exit函数内部会调用env_destroy

这样上面的中断和系统调用就都解释清楚了

Page fault and memory protection

非常重要的内容,保护内存,在进行内存操作的时候,检查当前的内存范围是不是当前进程可以访问的,如果不是的话,检查失败,结束进程

上面这段代码是参考别人的程序

检查给定的内存范围内的所有页,看当前的用户有没有权限访问

至此本次实验结束,折腾了一天半。。。

时间: 2024-10-09 11:17:28

MIT 6.828 xv6/jos LAB3-PARTB的相关文章

MIT 6.828 JOS学习笔记2. Lab 1 Part 1.2: The kernel

Lab 1 Part 1: PC bootstrap 我们继续~ PC机的物理地址空间 这一节我们将深入的探究到底PC是如何启动的.首先我们看一下通常一个PC的物理地址空间是如何布局的:                           这张图仅仅展示了内存空间的一部分. 第一代PC处理器是16位字长的Intel 8088处理器,这类处理器只能访问1MB的地址空间,即0x00000000~0x000FFFFF.但是这1MB也不是用户都能利用到的,只有低640KB(0x00000000~0x00

MIT 操作系统实验 MIT JOS lab3

MIT JOS lab3 Allocating the Environments Array In lab 2, you allocated memory in  mem_init()  for the  pages[]  array, which is a table the kernel uses to keep track of which pages are free and which are not. You will now need to modify  mem_init()  

资源向导之 JOS 计划 #持续更新中# MIT 6.828

JOS 计划 #持续更新中# 童鞋,上网要科学上网,做lab也要科学的做. 之前我一上来就做实验,很多资料都不知道.现在打算重新来过 方法: 0.xv6源码不要用MIT官网的那份,我的主机是Linux/Ubuntu 14.0各种编译error,我都改的想吐.后来直接用github上别人改好的,直接能跑起来没有编译错误的xv6. 1.按照MIT给出的课程安排表,每一次课的相关lecture必须全部过一遍. 2.要求的课堂作业必须完成,很多时候课程要求的任务是很轻松的,只要修改部分代码就行了.这里我

《MIT 6.828 Lab1: Booting a PC》实验报告

实验内容 熟悉x86汇编语言.QEMU x86仿真器.PC开机引导流程 测试6.828 内核的启动加载器(boot loader) 研究6.828 内核的初始化模板(JOS) 实验题目 Exercise 1:阅读汇编语言资料 Exercise 1. Familiarize yourself with the assembly language materials available on the 6.828 reference page. You don't have to read them

MIT 6.828 JOS/XV6 LAB4-partA

这一部分要实现的是对多核处理器的支持,然后实现系统调用只喜欢用户应用创建新的应用,而且还要实现round-robin调度算法 Multiprocessor support jos中对CPU进行了抽象 要描述一个CPU, 需要知道id,运行状态,当前正在运行的进程 所有的cpu数目放在cpus数组中 接下来则是对有多个cpu的处理器的抽象,这里使用了三个结构体,总之是比较乱,目前还不能完全看懂 多核处理器的初始化都在mp_init函数中完成,首先是调用mpconfig函数,主要功能是寻找一个MP

MIT 6.828 JOS/XV6 LAB4-partC

这一部分要实现抢占式调度和进程间通信 前面的调度是进程资源放弃CPU,但是实际中没有进程会这样做的,而为了不让某一进程耗尽CPU资源,需要抢占式调度,也就需要硬件定时 但是外部硬件定时在Bootloader的时候就关闭了,至今都没有开启 而JOS采取的策略是,在内核中的时候,外部中断是始终关闭的,而在用户态的时候,需要开启中断 所以首先需要求改IDT,但是我在之前把256个都弄好了 所以现在只需要在进入用户态的时候,保证外部中断是使能的就可以了,为了做到这一点,可以在每个进程初始化的时候就将外部

MIT 6.828 JOS/XV6 LAB4-partB

这里要实现的就是UNIX标准系统调用中的fork,核心当然是copy on write技术 至于为什么采用copy on write,是因为子进程在被创建之后很可能立刻执行exec()了,之前做的一系列的拷贝是无用功 所以说,当创建一个新的子进程的时候,只需要拷贝父进程的内存映射(页表)就可以了,而且将父进程所有的内存映射页都标记为只读的,这样,当子进程或者父进程尝试去读的时候是安全的,而当尝试去写的时候,就会出发page fault,而在page fault处理例程中,单独将被写入的页(比如说

MIT 6.828 JOS学习笔记17. Lab 3.1 Part A User Environments

Introduction 在这个实验中,我们将实现操作系统的一些基本功能,来实现用户环境下的进程的正常运行.你将会加强JOS内核的功能,为它增添一些重要的数据结构,用来记录用户进程环境的一些信息:创建一个单一的用户环境,并且加载一个程序运行它.你也可以让JOS内核能够完成用户环境所作出的任何系统调用,以及处理用户环境产生的各种异常. Part A: User Environments and Exception Handling 新包含的文件inc/env.h里面包含了JOS内核的有关用户环境(

MIT 6.828 JOS学习笔记7. Lab 1 Part 2.2: The Boot Loader

Lab 1 Part 2 The Boot Loader Loading the Kernel 我们现在可以进一步的讨论一下boot loader中的C语言的部分,即boot/main.c.但是在我们分析之前,我们应该先回顾一些关于C语言的基础知识. Exercise 4: 阅读关于C语言的指针部分的知识.最好的参考书自然是"The C Programming Language". 阅读5.1到5.5节.然后下载pointers.c的代码,并且编译运行它,确保你理解在屏幕上打印出来的所