操作系统lab2实验报告
- 格式:doc
- 大小:1.62 MB
- 文档页数:14
操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
操作系统lab2实验报告实验目的:本实验的目的是通过设计和实现一个简单的操作系统内核,加深对操作系统基本概念和原理的理解。
具体实验内容包括进程管理、内存管理和文件系统的设计与实现。
实验环境:1.操作系统:Linux2.编程语言:C语言一、实验背景1.1 操作系统简介操作系统是计算机系统中的一个重要组成部分,负责管理和控制计算机的各种资源,提供用户和应用程序的接口,以及协调和调度各种任务的执行。
1.2 实验目标本实验的主要目标是设计和实现一个简单的操作系统内核,包括进程管理、内存管理和文件系统等功能。
二、实验内容2.1 进程管理①进程创建描述进程创建的过程和相关数据结构,包括创建新进程的系统调用、进程控制块等。
②进程调度描述进程调度的算法和实现方式,包括进程调度队列、调度算法等。
③进程同步与通信描述进程同步和通信的机制和方法,包括信号量、互斥锁、条件变量等。
2.2 内存管理①内存分配描述内存分配的算法和实现方式,包括连续内存分配、非连续内存分配等。
②页面置换描述页面置换的算法和实现方式,包括最优页面置换算法、先进先出页面置换算法等。
2.3 文件系统①文件操作描述文件操作的系统调用和相关数据结构,包括文件打开、读写、关闭等。
②文件系统结构描述文件系统的组织结构和实现方式,包括超级块、索引节点、块位图等。
三、实验步骤3.1 环境搭建搭建实验环境,包括安装Linux操作系统、编译器等。
3.2 进程管理实现根据设计要求,实现进程创建、调度、同步与通信等功能。
3.3 内存管理实现根据设计要求,实现内存分配、页面置换等功能。
3.4 文件系统实现根据设计要求,实现文件操作和文件系统结构。
3.5 测试与调试编写测试用例,对实现的操作系统内核进行测试和调试,并记录实验结果。
四、实验结果分析分析测试结果,评估实验过程中遇到的问题和解决方法,总结操作系统内核的性能和功能特点。
五、实验总结对实验过程中的收获和经验进行总结,提出改进和优化的建议。
操作系统实验报告实验二一、实验目的本次操作系统实验二的目的在于深入理解和掌握操作系统中的进程管理和进程调度相关知识,通过实际的编程和实验操作,观察和分析不同进程调度算法的性能和效果,提高对操作系统核心概念的理解和应用能力。
二、实验环境本次实验在 Windows 10 操作系统下进行,使用 Visual Studio 2019作为编程工具。
实验中涉及的编程语言为 C++。
三、实验内容(一)进程创建与控制编写程序实现创建多个进程,并通过进程控制原语(如创建、等待、终止等)对进程进行管理和控制。
(二)进程调度算法实现1、先来先服务(FCFS)调度算法按照进程到达的先后顺序进行调度,先到达的进程先获得 CPU 资源进行执行。
2、短作业优先(SJF)调度算法优先调度执行时间短的进程,以减少平均等待时间。
3、时间片轮转(RR)调度算法将 CPU 时间划分为固定大小的时间片,每个进程在一个时间片内执行,时间片结束后切换到下一个进程。
(三)性能评估指标1、平均等待时间所有进程等待时间的总和除以进程数量。
2、平均周转时间所有进程周转时间的总和除以进程数量。
周转时间为进程从提交到完成的时间间隔。
四、实验步骤(一)进程创建与控制1、定义进程结构体,包含进程 ID、到达时间、执行时间等信息。
2、使用系统调用或库函数创建进程。
3、在父进程中通过等待函数等待子进程结束,并获取子进程的返回状态。
(二)进程调度算法实现1、先来先服务(FCFS)调度算法按照进程到达时间的先后顺序将进程放入就绪队列。
从就绪队列中取出第一个进程进行调度执行。
2、短作业优先(SJF)调度算法计算每个进程的执行时间。
按照执行时间从小到大的顺序将进程放入就绪队列。
从就绪队列中取出执行时间最短的进程进行调度执行。
3、时间片轮转(RR)调度算法将进程按照到达时间先后顺序放入就绪队列。
为每个进程分配一个时间片,当时间片用完后,将进程放入就绪队列尾部,重新调度下一个进程。
实验二Linux桌面环境的基本操作实验目的:1.通过本次实验熟练的掌握Linux操作系统桌面环境下的基本操2.了解Linux文件系统的目录格式。
3.掌握GNOME桌面环境和KDE桌面环境的切换。
实训内容1:熟悉GNOME桌面环境的各组成部分。
掌握文件管理器的使用方法。
设置GNOME桌面环境1.面板的基本操作【操作要求1】在GNOME桌面上增加和删除面板;在面板上增加和删除对象。
【操作步骤】见课件中的步骤。
【操作要求2】设置面板的位置和自动隐藏,启动不同的应用程序,将它们放置于不同的4个虚拟桌面(工作区)中。
【操作步骤】见课件中的步骤。
2. 查看Linux的目录结构,认识/bin、/etc、/lost+found、/sbin、/var、/boot、/root、/home、/mnt、/tmp、/dev、/lib、/proc、/usr目录及其作用。
【操作要求】查看Linux的目录结构。
【操作步骤】参见“Linux文件系统结构”课件中的内容。
3.使用文件管理器(注意:本操作尽量在/home目录中进行)【操作要求1】基本文件操作:a)新建文本文件;b)新建一个目录;c)以不同的视图方式查看文件;d)删除刚才新建的文本文件和目录【操作要求2】显示隐藏文件。
4.设置桌面【操作要求1】为虚拟桌面(工作区)更换桌面背景图片。
【操作要求2】更换桌面屏幕保护程序。
【操作步骤】以上3个操作要求见课件。
5.熟悉Linux的目录结构【操作要求1】找到桌面(Desktop)所对应的实际目录。
【操作步骤】root的主文件夹-Desktop中可以找到。
实验内容2熟悉KDE桌面环境的各组成部分。
掌握Konqueror文件管理器的使用方法。
设置KDE桌面环境。
1.面板的基本操作【操作要求1】在KDE面板上增加和删除对象。
【操作步骤】见课件及书上【操作要求2】设置面板的位置和自动隐藏。
【操作步骤】见课件及书上2.桌面的基本操作【操作要求】重新排列桌面图标,将虚拟桌面设置为6个。
华东师范大学软件学院实验报告实验课程:操作系统实践年级:大二实验成绩:实验名称:Pintos-User Programs 姓名:实验编号:学号:实验日期:2018/12/27指导教师:组号:实验时间:4学时一、实验目的当前, 我们已经完成了pintos 的第一部分(熟悉了其基础结构和线程包), 现在是开始处理系统中允许运行用户程序的部分的时候了。
基本代码已经支持加载和运行用户程序, 但不能加载和运行或交互性。
在此项目中, 我们将使程序能够通过系统调用与操作系统进行交互。
我们将在"userprog" 目录中进行工作, 但我们也将与pintos 的几乎所有其他部分进行交互。
具体目的如下:(1)了解Pintos操作系统的功能流程及内核的软件工程结构。
(2)通过Pintos操作系统内核的剖析,了解现有Pintos操作系统在处理用户程序方面中存在的参数传递问题,有效解决其参数传递的问题。
(3)通过Pintos内核剖析,了解其中断处理的机制,学会操作系统中断功能的编写方法。
(4)了解现有Pintos操作系统的系统调用功能,根据其中断机制,完善系统调用功能,使Pintos系统具有处理用户中断请求的功能。
(5)通过Pintos内核剖析,解决现有Pintos操作系统中存在的进程终止时缺少终端提示的问题。
(6)通过Pintos内核剖析,解决现有Pintos操作系统中存在的运行文件禁止写操作的问题。
二、实验内容与实验步骤实验内容如下:(1)在分析内核的基础上,对Pintos操作系统的参数传递问题提出有效的策略,设计算法,分步跟踪和调试,通过实践,有效解决参数传递问题,并对实验结果进行分析。
(2)通过Pintos操作系统内核的剖析,了解其中断处理的机制,在此基础上,完善Pintos的系统调用功能,设计算法,分步跟踪和调试,通过测试分析完善的系统调用功能。
(3)在分析内核的基础上,对现有Pintos操作系统进行完善,增加进程终止的终端提示功能,设计算法,分步跟踪和调试,通过实践,验证终端提示功的有效性。
OS-lab2实验报告lab2实验报告⼀、实验思考题Thinking 2.1请思考cache⽤虚拟地址来查询的可能性,并且给出这种⽅式对访存带来的好处和坏处。
另外,你能否能根据前⼀个问题的解答来得出⽤物理地址来查询的优势?虚拟地址:cache⽤虚拟地址来查询是有可能的,并且确实存在这样的cache组织⽅式(VIVT、VIPT)好处:不需要使⽤mmu转换成物理地址就可以直接根据虚拟地址查找cache中的数据坏处:不同的进程可能会有相同的虚拟地址,安全性和数据正确性很难保证,需要引⼊物理地址或者其他的标识符加以区分物理地址:优势:优势即在于没有根据虚拟地址查询时需要区分不同的进程的问题,查询的安全性和数据正确性更有保证Thinking 2.2在我们的实验中,有许多对虚拟地址或者物理地址操作的宏函数(详见include/mmu.h ),那么我们在调⽤这些宏的时候需要弄清楚需要操作的地址是物理地址还是虚拟地址,阅读下⾯的代码,指出x是⼀个物理地址还是虚拟地址。
int x;char *value = return_a_pointer();*value = 10;x = (int) value;x是⼀个虚拟地址Thinking 2.3我们在 include/queue.h 中定义了⼀系列的宏函数来简化对链表的操作。
实际上,我们在 include/queue.h ⽂件中定义的链表和 glibc 相关源码较为相似,这⼀链表设计也应⽤于Linux 系统中 (sys/queue.h ⽂件)。
请阅读这些宏函数的代码,说说它们的原理和巧妙之处。
原理:链表头是⼀个结构体,存储了头指针,对于链表的每⼀个节点,内部存储的结构体存储了指向下⼀个节点的地址和前⼀项中指向下⼀个节点的指针的地址。
巧妙之处:每⼀个节点存储了前⼀项中指向下⼀个节点的指针的地址,插⼊和删除节点的复杂度很低Thinking 2.4我们注意到我们把宏函数的函数体写成了 do { /* ... */ } while(0)的形式,⽽不是仅仅写成形如 { /* ... */ } 的语句块,这样的写法好处是什么?空的宏定义避免warning存在⼀个独⽴的block,可以⽤来进⾏变量定义,替换到程序当中不会产⽣歧义或者错误,能够进⾏⽐较复杂的实现Thinking 2.5注意,我们定义的 Page 结构体只是⼀个信息的载体,它只代表了相应物理内存页的信息,它本⾝并不是物理内存页。
《操作系统》实验二一、实验目的本实验旨在加深对操作系统基本概念和原理的理解,通过实际操作,提高对操作系统设计和实现的认知。
通过实验二,我们将重点掌握进程管理、线程调度、内存管理和文件系统的基本原理和实现方法。
二、实验内容1、进程管理a.实现进程创建、撤销、阻塞、唤醒等基本操作。
b.设计一个简单的进程调度算法,如轮转法或优先级调度法。
c.实现进程间的通信机制,如共享内存或消息队列。
2、线程调度a.实现线程的创建、撤销和调度。
b.实现一个简单的线程调度算法,如协同多任务(cooperative multitasking)。
3、内存管理a.设计一个简单的分页内存管理系统。
b.实现内存的分配和回收。
c.实现一个简单的内存保护机制。
4、文件系统a.设计一个简单的文件系统,包括文件的创建、读取、写入和删除。
b.实现文件的存储和检索。
c.实现文件的备份和恢复。
三、实验步骤1、进程管理a.首先,设计一个进程类,包含进程的基本属性(如进程ID、状态、优先级等)和操作方法(如创建、撤销、阻塞、唤醒等)。
b.然后,实现一个进程调度器,根据不同的调度算法对进程进行调度。
可以使用模拟的方法,不需要真实的硬件环境。
c.最后,实现进程间的通信机制,可以通过模拟共享内存或消息队列来实现。
2、线程调度a.首先,设计一个线程类,包含线程的基本属性(如线程ID、状态等)和操作方法(如创建、撤销等)。
b.然后,实现一个线程调度器,根据不同的调度算法对线程进行调度。
同样可以使用模拟的方法。
3、内存管理a.首先,设计一个内存页框类,包含页框的基本属性(如页框号、状态等)和操作方法(如分配、回收等)。
b.然后,实现一个内存管理器,根据不同的内存保护机制对内存进行保护。
可以使用模拟的方法。
4、文件系统a.首先,设计一个文件类,包含文件的基本属性(如文件名、大小等)和操作方法(如创建、读取、写入、删除等)。
b.然后,实现一个文件系统管理器,包括文件的存储和检索功能。
LAB2实验报告2033数字系统组成原理实验实验二运算器ALU181学号 1315212033姓名滕健伟班级电子信息2班华侨大学电子工程系一、算术逻辑运算实验一.实验目的1.了解简单运算器的数据传输通路。
2.验证运算功能发生器的组合功能。
3.掌握算术逻辑运算加、减、与的工作原理。
4.验证实验台运算的8 位加、减、与、直通功能。
5.按给定数据,完成几种指定的算术和逻辑运算。
二.实验内容实验原理算术逻辑单元ALU 的数据通路如图1-1 所示。
其中运算器ALU181 根据74LS181 的功能用VHDL 硬件描述语言编辑而成,构成8 位字长的ALU。
参加运算的两个8 位数据分别为A[7..0]和B[7..0],运算模式由S[3..0]的16 种组合决定,而S[3..0]的值由4 位2 进制计数器LPM_COUNTER 产生,计数时钟是Sclk;此外,设M=0,选择算术运算,M=1 为逻辑运算,CN 为低位的进位位;F[7..0]为输出结果,CO 为运算后的输出进位位。
两个8 位数据由总线IN[7..0]分别通过两个电平锁存器74373 锁入,ALU 功能如表1-1 所示。
选择端高电平作用数据S3S2S1S0M=H M=L算术操作逻辑功能Cn=L(无进位)Cn=H(有进位)0000F= A F= A F= A加10001F= A+ B F= A+ B F=(A+ B)加10010F= AB F= A+ B F= A+ B+10011F= 0 F= 减1(2的补码)F= 00100F= AB F= A加AB F= A加AB加10101F= B F=(A+ B)加AB F=(A+ B)加AB+10110F= A⊕ B F= A减B F= A减B减10111F= AB F= A+ B F= (A+ B)减11000F= A + B F= A加AB F= A加AB加11001 F = A⊕ B F= A加B F= A加B加11010F= B F=(A+ B)加AB F= (A+ B)加AB加11011F= AB F= AB F= AB减11100F= 1 F= A加A*F= A加A加11101F= A+ B F=(A+ B)加A F=(A+ B)加A加11110F= A+ B F=(A+ B)加A F=(A+ B)加A加11111F= A F= A F= A减1表1-1三.实验步骤(1)设计ALU 元件在Quartus II 环境下,用文本输入编辑器T ext Editor 输入ALU181.VHD 算术逻辑单元文件,编译VHDL文件,并将ALU181.VHD 文件制作成一个可调用的原理图元件。
操作系统实验报告哈尔滨工程大学软件学院第二讲操作系统的启动一、实验概述1. 实验名称操作系统的启动2. 实验目的● 跟踪调试EOS在PC机上从加电复位到成功启动的全过程,了解操作系统的启动过程。
● 查看EOS启动后的状态和行为,理解操作系统启动后的工作方式。
3. 实验类型(验证、设计)验证4. 实验内容1.准备实验2.调试EOS操作系统的启动过程2.1使用Bochs做为远程目标机2.2 调试BIOS程序2.3 调试软盘引导扇区程序2.4 调试加载程序2.5 调试内核2.6 EOS启动后的状态和行为二、实验环境操作系统:windos xp工 具:Tevation OS Lab三、实验过程(每次实验不一定下面6条都写,根据实际情况定)1. 设计思路和流程图根据已给的地址,计算高端地址,设计查看内存的调试命令图2.1 EOS启动流程图2. 算法实现无3. 需要解决的问题及解答(1)设计两个查看内存的调试命令,分别验证这两个用户可用区域的高地址端也是空白的第一条命令:0x7a08第二条命令:0x9fe08(2)设计一个查看内存的调试命令,验证上位内存的高地址端已经被系统占用命令:0xffe08(3)设计一个查看内存的调试命令,查看内存中loader程序结束位置的字节码,并与loader.lst文件中最后指令的字节码比较,验证loader程序被完全加载到了正确的位置。
命令:0x1616(4)仔细比较图10-6和图10-5,尝试说明哪个是应用程序的进程,它和系统进程有什么区别,哪个是应用程序的主线程,它和系统线程有什么区别应用程序进程:ID为31的进程为应用程序进程与系统进程的区别:系统进程用于完成操作系统的各种功能的进程,是处于运行状态下的操作系统本身;应用程序进程就是所有由用户启动的进程。
应用程序主线程:PrimaryThreadID=31的是应用程序主线程与系统线程的区别:主线程的优先级别高。
存放在物理内存的低端四、实验体会过本次试验,我对计算机存储结构有了更深的认识,在验证的过程中计算地址时出现了失误,但在和同学讨论中解决了问题,复习了二进制十进制及十六进制之间的转换。
HUNAN UNIVERSITY操作系统实验报告目录一、内容 (3)二、目的 (3)三、实验设计思想和练习题 (3)练习0:填写已有实验 (3)练习1:实现 first-fit 连续物理内存分配算法(需要编程) (3)练习2:实现寻找虚拟地址对应的页表项(需要编程) (8)练习3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程) (11)运行结果 (13)四、实验体会 (13)一、内容本次实验包含三个部分。
首先了解如何发现系统中的物理内存;然后了解如何建立对物理内存的初步管理,即了解连续物理内存管理;最后了解页表相关的操作,即如何建立页表来实现虚拟内存到物理内存之间的映射,对段页式内存管理机制有一个比较全面的了解。
二、目的1.理解基于段页式内存地址的转换机制;2.理解页表的建立和使用方法;3.理解物理内存的管理方法。
三、实验设计思想和练习题练习0:填写已有实验使用eclipse中的diff/merge工具将实验1的代码填入本实验中代码中有“LAB1”的注释相应部分。
练习1:实现 first-fit 连续物理内存分配算法(需要编程)在实现first fit 内存分配算法的回收函数时,要考虑地址连续的空闲块之间的合并操作。
提示:在建立空闲页块链表时,需要按照空闲页块起始地址来排序,形成一个有序的链表。
可能会修改default_pmm.c 中的default_init,default_init_memmap,default_alloc_pages, default_free_pages等相关函数。
请仔细查看和理解default_pmm.c中的注释。
请在实验报告中简要说明你的设计实现过程。
请回答如下问题:你的first fit算法是否有进一步的改进空间。
解答:分析思路:(1)数据结构:A.每个物理页利用一个Page结构体表示,查看kern/mm/memlayout.h包括:ref:引用计数,即映射此物理页的虚拟页个数;flags:描述物理页属性,bit 0设置为1,即为“被保留”项,bit 1设置为1,即为空闲项;property:记录某连续内存块的大小,即地址连续的空闲页的个数;page_link:将多个连续内存链接在一起的双向链表指针,即构建双向链接各个Page结构的双向链表。
B.所有的连续内存空闲块可用一个双向链表管理,利用一个free_area_t结构体表示,查看kern/mm/memlayout.h包括:list_entry:双向链表指针,指向空闲的物理页;nr_free:记录当前空闲页的个数的无符号整形变量。
(2)连续物理内存分配思路:物理内存页管理器顺着双向链表进行搜索空闲内存区域,直到找到一个足够大的空闲区域,这是一种速度很快的算法,因为它尽可能少地搜索链表。
如果空闲区域的大小和申请分配的大小正好一样,则把这个空闲区域分配出去,成功返回;否则将该空闲区分为两部分,一部分区域与申请分配的大小相等,把它分配出去,剩下的一部分区域形成新的空闲区。
其释放内存的设计思路是把这块区域重新放回双向链表中。
(3)具体设计:bootloader进行探测物理格局后,利用kern_entry()函数设置堆栈,并临时建立一个段映射关系,调用kern_init()函数输出检查后,pmm_init()函数完成物理内存的管理,假定page_init()函数是按照地址从小到大的顺序传递连续内存空闲块,根据page_init()函数中传递的参数(某个连续的空闲块的起始页,页个数),default_init_memmap()来建立一个连续内存空闲块的双向链表,链表头设free_area.free_list,链表项设Page的base->page_link。
代码分析:(1)default_init_memmap :用于构建空闲页链表;A.步骤:(1)初始化每一个空闲页,注意使用头插法是因为地址是从低到高地址增长;(2)计算空闲页的总数。
B.具体实现:(2)default_alloc_pages :用于为进程分配空闲页;A.步骤:(1)从空闲链表表头开始查找最小的地址,寻找足够大的空闲块;(2)如果找到,获得指向分配的页,重新设置标志位,从空闲链表中删除此页;(3)判断空闲块大小是否合适;(4)如果合适,不操作;如果不合适,分割页块;(5)计算剩余空闲页个数,返回分配的页块地址。
B.具体实现:注:算法改进空间:第一页重置标志位操作被注释后,依然可以编译运行。
(3)default_free_pages :用于释放已经使用完的页,使其合并到free_list中;A.步骤:(1)在free_list中查找合适位置,用以插入;(2)改变被释放页的标志位flags及计数器ref;(3)在free_list中向高地址或第地址合并。
B.具体实现:练习2:实现寻找虚拟地址对应的页表项(需要编程)通过设置页表和对应的页表项,可建立虚拟内存地址和物理内存地址的对应关系。
其中的get_pte函数是设置页表项环节中的一个重要步骤。
此函数找到一个虚地址对应的二级页表项的内核虚地址,如果此二级页表项不存在,则分配一个包含此项的二级页表。
本练习需要补全get_pte函数 in kern/mm/pmm.c,实现其功能。
请回答如下问题:请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中每个组成部分的含义和以及对ucore 而言的潜在用处。
如果ucore执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?解答:分析思路:pde_t为page directory entry,也就是一级页表的表项。
pte_t为page table entry,表示二级页表的表项。
uintptr_t表示为线性地址,由于段式管理只做直接映射,所以它也是逻辑地址。
pgdir(一级页表)给出页表起始地址。
通过查找这个页表,我们需要给出二级页表中对应项的地址。
虽然目前我们只有boot_pgdir一个页表,但是引入进程的概念之后每个进程都会有自己的页表。
有可能根本就没有对应的二级页表的情况,所以二级页表不必要一开始就分配,而是等到需要的时候再添加对应的二级页表。
如果在查找二级页表项时,发现对应的二级页表不存在,则需要根据create参数的值来处理是否创建新的二级页表。
如果create参数为0,则get_pte返回NULL;如果create参数不为0,则get_pte需要申请一个新的物理页(通过alloc_page来实现,可在mm/pmm.h中找到它的定义),再在一级页表中添加页目录项指向表示二级页表的新物理页。
注,新申请的页必须全部设定为零,因为这个页所代表的虚拟地址都没有被映射。
当建立从一级页表到二级页表的映射时,需要注意设置控制位。
这里应该设置同时设置上PTE_U、PTE_W和PTE_P(定义在mm/mmu.h):PTE_U:表示用户态的软件可以读取对应地址的物理内存页内容;PTE_W:表示物理内存页内容可写;PTE_P:表示物理内存页存在如果原来就有二级页表,或者新建立了页表,则只需返回对应项的地址即可。
代码分析:A.步骤:(1)尝试获取页表起始地址;(2)若不成功则直接返回NULL,若成功则申请一个物理页;(3)获得物理页的线性地址,在一级页表中添加页目录项指向表示二级页表的新物理页;(4)返回页表地址。
B.具体实现:问题解答:(1)请描述页目录项(Pag Director Entry)和页表(Page Table Entry)中每个组成部分的含义和以及对ucore而言的潜在用处。
答:高20位表示下一级页表(或物理页表)的基址(4K对齐),后12位为标志位,分别为从低位起第0~6位为ucore内核占用,表示指向的下一级页面的某些特性(是否存在、是否可写……);对于PDE,第7位表示如果pde的PTE_PS位为1,那么pde中所存的就不是下一级页表,而是一张4M页的起始地址;对于PTE,第7、8位强制位0;第9~11位供内核以外的软件使用。
(2)如果ucore执行过程中访问内存,出现了页访问异常,请问硬件要做哪些事情?答:出现页访问异常会触发缺页中断,缺页中断发生时的事件顺序如下:1) 硬件陷入内核,在内核堆栈中保存程序计数器。
大多数机器将当前指令的各种状态信息保存在特殊的CPU寄存器中。
2) 启动一个汇编代码例程保存通用寄存器和其他易失的信息,以免被操作系统破坏。
3) 当操作系统发现一个缺页中断时,尝试发现需要哪个虚拟页面。
通常一个硬件寄存器包含了这一信息,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析这条指令,看看它在缺页中断时正在做什么。
4) 一旦知道了发生缺页中断的虚拟地址,操作系统检查这个地址是否有效,并检查存取与保护是否一致。
如果不一致,向进程发出一个信号或杀掉该进程。
如果地址有效且没有保护错误发生,系统则检查是否有空闲页框。
如果没有空闲页框,执行页面置换算法寻找一个页面来淘汰。
5) 如果选择的页框“脏”了,安排该页写回磁盘,并发生一次上下文切换,挂起产生缺页中断的进程,让其他进程运行直至磁盘传输结束。
无论如何,该页框被标记为忙,以免因为其他原因而被其他进程占用。
6) 一旦页框“干净”后(无论是立刻还是在写回磁盘后),操作系统查找所需页面在磁盘上的地址,通过磁盘操作将其装入。
该页面被装入后,产生缺页中断的进程仍然被挂起,并且如果有其他可运行的用户进程,则选择另一个用户进程运行。
7) 当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映它的位置,页框也被标记为正常状态。
8) 恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。
9) 调度引发缺页中断的进程,操作系统返回调用它的汇编语言。
10) 该例程恢复寄存器和其他状态信息。
练习3:释放某虚地址所在的页并取消对应二级页表项的映射(需要编程)当释放一个包含某虚地址的物理内存页时,需要让对应此物理内存页的管理数据结构Page做相关的清除处理,使得此物理内存页成为空闲;另外还需把表示虚地址与物理地址对应关系的二级页表项清除。
请仔细查看和理解page_remove_pte函数中的注释。
为此,需要补全在 kern/mm/pmm.c中的page_remove_pte 函数。
请回答如下问题:数据结构Page的全局变量(其实是一个数组)的每一项与页表中的页目录项和页表项有无对应关系?如果有,其对应关系是啥?如果希望虚拟地址与物理地址相等,则需要如何修改lab2,完成此事?解答:分析思路:使用pte2page宏即可得到从页表项得到对应的物理页面所对应的Page结构体。
得到结构体后,判断此页被引用的次数,如果仅仅被引用一次,对页面引用进行更改,降为零则这个页可以被释放。