计算机操作系统实验指导-基于RISC-V代理内核 课件全套 第1-6章 RISC-V体系结构-实验4:文件系统_第1页
计算机操作系统实验指导-基于RISC-V代理内核 课件全套 第1-6章 RISC-V体系结构-实验4:文件系统_第2页
计算机操作系统实验指导-基于RISC-V代理内核 课件全套 第1-6章 RISC-V体系结构-实验4:文件系统_第3页
计算机操作系统实验指导-基于RISC-V代理内核 课件全套 第1-6章 RISC-V体系结构-实验4:文件系统_第4页
计算机操作系统实验指导-基于RISC-V代理内核 课件全套 第1-6章 RISC-V体系结构-实验4:文件系统_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于RISC-V代理内核的操作系统课程实验与课程设计第一章RISC-V体系结构目录RISC-V简介代理内核简介相关工具软件RISC-V简介RISC-V是一种典型的精简(ReducedInstructionSetComputer,简写为RISC)指令集,开放的指令集。该项目2010年始于加州大学伯克利分校,但许多贡献者是该大学以外的志愿者和行业工作者。RISC-V指令集后发优势:借鉴了之前的传统商业指令集,取长补短。开放架构:开放指令集,自由使用。场景丰富:指令集的设计综合考虑了多种应用场景。开源参考:(RISC-V处理器的)开源实现众多。RISC-V指令集的分类基本整数指令集:RV32I、RV64I、RV128I。扩展指令集指令集:见右表指令集简写惯例:如RV64IMAF、RV64G(G=I+M+A+F)简称描述M整数乘除法标准扩展A不可中断指令标准扩展F单精确度浮点运算标准扩展D双倍精确度浮点运算标准扩展G所有以上的扩展指令集以及基本指令集的总和的简称Q四倍精确度浮点运算标准扩展L十进制浮点运算标准扩展C压缩指令标准扩展B位操作标准扩展J动态指令翻译标准扩展T顺序存储器访问标准扩展P单指令多数据流运算标准扩充V向量运算标准扩充N用户级别中断标准扩充常用扩展指令集

RV64G机器的汇编语言

寄存器:通用寄存器见右表其他寄存器:如pc、状态寄存器寄存器编程接口名称(ABI)描述使用x0zeroHard-wiredzero硬件零x1raReturnaddress常用于保存(函数的)返回地址x2spStackpointer栈顶指针x3gpGlobalpointer—x4tpThreadpointer—x5-7t0-2Temporary临时寄存器x8s0/fpSavedRegister/Framepointer(函数调用时)保存的寄存器和栈顶指针x9s1Savedregister(函数调用时)保存的寄存器x10-11a0-1Functionargument/returnvalue(函数调用时)的参数/函数的返回值x12-17a2-7Functionargument(函数调用时)的参数x18-27s2-11Savedregister(函数调用时)保存的寄存器x28-31t3-6Temporary临时寄存器32个通用寄存器指令格式RV64I的指令分类:整数指令:add、sub、and、or、sll、slr、lui等。访存指令:lb、lh、lw、ld、sb、sh等。控制转移指令:be、bne、bge、jalr等。指令格式(以加法指令add为例):addrd,rs1,rs2加法指令编码指令命名规则(PKE中用到的)常见指令:lw、sw、ld、sd、addi、mul、jr、call、ret等。用户态指令级特权指令级访存和寻址模式在内存访问上,RISC-V提供的接口(相比于8086汇编)极其简单:读内存(load):例如ldrd,offset(rs1)

写内存(store):例如swrs2,offset(rs1)注:RISC-V采用小端字节序。如将0x1234ABCD写入0x800地址后,各个地址的数据如下:[0x00000800]=0xCD;[0x00000801]=0xAB[0x00000802]=0x34;[0x00000803]=0x12C语言内嵌汇编基本内联汇编语句: asm(“statements”);扩展内联汇编:asmvolatile("statements"(汇编语句模板):output_regs(输出部分):input_regs(输入部分):clobbered_regs(破坏描述部分));内嵌汇编实例:intdest=0;intvalue=1;asmvolatile("lwt0,%1\n\t""addt0,t0,t0\n\t""sdt0,%0":"=m"(dest)//输出部分:"m"(value)//输入部分:"memory"//破坏描述部分);机器的特权状态三种特权状态的切换Machine模式下的CSR寄存器作用mscratchMachineScratch。保存机器模式的栈顶指针,这一点在离开机器模式进入低特权级模式(如监管模式)时非常重要,因为一旦在低特权级模式发生异常,将可能会回到机器模式处理,这时机器模式需要有自己的栈来保存M模式下的执行所调用的函数参数和返回地址。mstatusMachineStatus。保存机器状态的寄存器。mtvecMachineTrapVector。指向中断处理函数的入口地址。mepcMachineExceptionPC。指向发生异常的那条指令的地址。mcauseMachineCause。发生中断的原因,如果发生的中断是异常,其最高位为0,低位为异常编号;如果发生的是其他类型的中断,则其最高位为1,低位为中断编号。mtvalMachineTrapValue。异常发生时,附带的参数值。例如,当缺页异常发生时,mtval的值就是程序想要访问的虚地址。mieMachineInterruptEnable。中断开启寄存器。mipMachineInterruptPending。中断等待寄存器。midelegMachineInterruptDelegationRegisters。中断代理寄存器。medelegMachineExceptionDelegationRegisters。异常代理寄存器。Machine模式下的mstatusMIE,SIE,UIE:中断使能位。MPIE,SPIE,UPIE:中断使能保存位。SPP,MPP:发生中断异常之前的机器模式。MPRV,MXR,SUM:访存控制相关位。mstatus寄存器Supervisor模式下的CSR寄存器作用sscratchSupervisorScratch。保存监管模式的栈顶指针,这一点在离开机器模式进入低特权级模式(如用户模式)时非常重要,因为一旦在低特权级模式发生异常,将可能会回到监管模式处理(假设已通过异常授权),这时监管模式需要用自己的栈保存程序执行的返回地址等。sstatusSupervisorStatus。保存监管状态的寄存器。stvecSupervisorTrapVector。指向监管模式中断处理函数的入口地址。sepcSupervisorExceptionPC。指向发生异常的那条指令的地址。scauseSupervisorCause。发生中断的原因,如果发生的中断是异常,其最高位为0,低位为异常编号;如果发生的是其他中断其最高位为1,低位为中断编号。stvalSupervisorTrapValue。异常发生时,附带的参数值。例如,当缺页异常发生时,mtval的值就是程序想要访问的虚地址。sieSupervisorInterruptEnable。中断开启寄存器。sipSupervisorInterruptPending。中断等待寄存器。sidelegSupervisorInterruptDelegationRegisters。中断代理寄存器。sedelegSupervisorExceptionDelegationRegisters。异常代理寄存器。Supervisor模式下的sstatussstatus与前面讲述的mstatus结构相似。sstatus中与mstatus相同位置的字段具有与mstatus有类似的作用。sstatus寄存器mstatus寄存器CSR寄存器的读写指令对CSR的读写操作仅可使用CSR读写指令,常用的CSR读写指令有:指令功能csrrrd,csrControlandStatusRegisterRead,读CSR指令。把csr寄存器中的值写入到rd寄存器中。csrwcsr,rs1ControlandStatusRegisterWrite,写CSR指令。把rs1的值写到csr寄存器中。csrscsr,rs1ControlandStatusRegisterSet,设置CSR指令。对于rs1中每一个为1的位,将csr寄存器中对应位置位。csrccsr,rs1ControlandStatusRegisterClear,清除CSR指令。对于rs1中每一个为1的位,将csr寄存器中对应位清零。csrrsrd,csr,rs1ControlandStatusRegisterReadandSet,读后置位CSR指令。记控制寄存器中的值为t,把t和寄存器rs1按位或的结果写入csr寄存器,再把t写入rd寄存器。csrrcrd,csr,rs1ControlandStatusRegisterReadandClear,读后清除CSR指令。记控制寄存器中的值为t,把t和寄存器rs1中的值按位与的结果写入csr寄存器,再把t写入rd寄存器。csrrwrd,csr,rs1ControlandStatusRegisterReadandWrite,读后写CSR指令。记控制寄存器中的值为t,把寄存器rs1的值写入csr寄存器,再把t写入rd寄存器。

中断和中断处理

中断分为以下三类:Exception(异常)。Trap(即我们通常理解的“系统调用”或者“软件中断”)。

Interrupt:一般由外部设备产生。中断示意图中断向量表InterruptCode中断描述13Machinesoftwareinterrupt17Machinetimerinterrupt111Machineexternalinterrupt1>=16Implementationdefinedlocalinterrupts02IllegalInstruction08EnvironmentcallfromU-mode09EnvironmentcallfromS-mode013Loadpagefault015Store/AMOpagefault中断向量表(部分)中断处理通常包括以下几个步骤:中断请求:在中断请求被响应之前会一直发送中断请求。中断源识别:当系统同时有多个中断源发出的中断请求时,系统往往只能相应并处理一个中断,这就要求CPU对来到的中断请求进行判优,选择出同一时间优先级最高的给予响应和处理。中断响应:中断响应时,CPU要向中断源发出中断响应信号。中断处理:保护软件现场(把中断服务子程序中要用到的寄存器的内容压入堆栈)、开中断(为了可以嵌套)、执行中断处理程序、关中断、恢复现场。中断返回:返回到中断前程序执行位置的下一条指令。中断处理过程RISC-V的中断代理机制RISC-V可以将系统中的特定中断或者异常,通过设置较高特权级的CSR寄存器,“代理给”某个更低的特权级处理。机器模式“代理”给监管模式监管模式“代理”给用户模式PKE代码中的中断代理实例:uintptr_tinterrupts=MIP_SSIP|MIP_STIP|MIP_SEIP;uintptr_texceptions=(1U<<CAUSE_MISALIGNED_FETCH)| (1U<<CAUSE_FETCH_PAGE_FAULT)|(1U<<CAUSE_BREAKPOINT)|(1U<<CAUSE_LOAD_PAGE_FAULT)|(1U<<CAUSE_STORE_PAGE_FAULT)|(1U<<CAUSE_USER_ECALL);write_csr(mideleg,interrupts);write_csr(medeleg,exceptions);页式虚存管理为了实现程序逻辑地址到物理地址的转换,采用RV64G指令集的RISC-V处理器在监管模式提供了三种方式(

也称VMM):Bare:物理内存地址等于虚拟内存地址;Sv39:支持39位逻辑地址;Sv48:Sv39的简单扩展。Sv39中的物理地址与逻辑地址Sv39中逻辑地址的结构Sv39中PDE/PTE格式

Sv39中虚拟地址到物理地址的转换过程

Sv39中虚拟地址到物理地址的转换过程示意图satpsatp寄存器格式satp寄存器中MODE域的取值和含义取值虚存方案0Bare8Sv399Sv48目录RISC-V简介代理内核简介相关工具软件

代理内核

代理内核的概念代理内核是一种轻量级的应用程序执行环境,可以承载静态链接的RISC-VELF文件。代理内核的工作适配的场景是,既有主机(host)又有目标机(target)的场景。代理内核并非独立存在的系统,它不具有独自的IO实现,而是将IO功能代理到Host主机上。它可以看成是操作系统的一个极小集,为应用提供最基本的操作系统支撑,使得应用可以在只具备核心资源(包括处理器、内存)的裸机上运行。

代理内核

代理内核与主机内核的交互代理内核的主要功能通过前端服务器(frontendserver,fesvr)和HTIF(Host/TargetInterface)实现。fesvr是ARM端系统上运行的程序,控制PKE的启动。其主要分为两个模块:系统调用模块负责接受PKE对ARM端的系统调用请求,在ARM端执行这些函数;内存模块负责读写RISCV端的内存,和PKE交换数据。代理内核的实际应用PKE的设备和文件实验内容(lab5)注:lab1~4属于操作系统实验,lab5属于《系统能力培养综合训练——蓝牙小车》课程。目录RISC-V简介代理内核简介相关工具软件相关工具软件git:开源的分布式版本控制系统gitinitgitadd*.cgitcommit-m‘myversion1’gitcloneurlgitstatusgitbranchgitcheckout-bdevorigin/degitpushorigingitloggit仓库中文件的状态转换相关工具软件RISC-V交叉编译器riscv64-unknown-elf-gccriscv64-unknown-elf-objdumpriscv64-unknown-elf-asRISC-V模拟器spike常见Linux命令如file等命令对相关工具软件的要求会用!了解git命令各开关的用途了解交叉编译器中工具软件的用途第二章实验环境配置与实验构成

基于RISC-V代理内核的操作系统课程实验与课程设计

目录

实验环境安装安装操作系统环境安装执行支撑软件头歌平台实验代码的获取PKE实验构成

2.1实验环境安装

安装操作系统环境:WindowsSubversionLinux(WSL)Ubuntu或者其他Linux发行版头歌实验平台(无需安装)安装执行支撑软件注:PKE实验涉及到的执行支撑软件有:RISC-V交叉编译器(及附带的主机编译器、构造工具等);spike模拟器。方案一:下载自包含交叉编译器+执行环境第一步,安装依赖库第二步,下载自包含交叉编译器+执行环境第三步,设置环境变量安装执行支撑软件方案二:完整自行构建交叉编译器和执行环境第一步,安装依赖库第二步,获取RISC-V交叉编译器的源代码第三步,构建(build)RISC-V交叉编译器第四步,设置环境变量第五步,安装spike模拟器头歌平台第一步:搜索课程头歌主页截图头歌平台第二步:进入课程头歌网页截图头歌平台第三步:进入实战头歌网页截图头歌平台第四步:开始实战头歌网页截图

目录

实验环境安装安装操作系统环境安装执行支撑软件头歌平台实验代码的获取PKE实验构成

实验代码的获取

对于头歌平台而言,无需自己获取代码。对于其他方式(自安装系统)需要使用git命令从gitee上获取代码命令:$gitclone/hustos/riscv-pke.git通过人民邮电出版社的书籍官网下载参考《实验指导》书内说明

目录

实验环境安装安装操作系统环境安装执行支撑软件头歌平台实验代码的获取PKE实验构成

2.3PKE实验的组成

PKE实验由4组基础实验以及基础试验后的挑战实验组成:基础实验:第一组基础实验重点涉及系统调用、异常和外部中断的知识;第二组基础实验重点涉及主存管理方面的知识;第三组基础实验重点涉及进程管理方面的知识;第四组基础实验重点设计文件系统方面的知识。挑战实验:每一组实验的挑战实验都可以理解为在该组实验上的挑战性内容。

PKE实验的组成

PKE实验的组织结构《操作系统》实验和课程设计安排(建议)课内实验(16学时)基础内容:PKE基础实验(lab1_1~lab4_3)挑战实验:lab1_challenge1、lab2_challenge1、lab3_challenge1、lab4_challenge1课程设计(2周)挑战实验:

lab1_challenge2、lab2_challenge2、lab3_challenge2、lab4_challenge2、lab1_challenge3、lab2_challenge3、lab3_challenge3、lab4_challenge3基于RISC-V代理内核的操作系统课程实验与课程设计第三章.实验1:系统调用、异常和外部中断

目录

实验1的基础知识RISC-V程序的编译和链接指定符号的逻辑地址代理内核的构造过程代理内核的启动过程ELF文件(app)的加载过程spike的HTIF接口实验内容lab1_1系统调用lab1_2异常处理lab1_3(外部)中断3.1实验1的基础知识RISC-V程序编译主要过程:预处理:展开头文件、宏替换、条件编译、删除注释等等;编译:语法检查;汇编:将汇编文件翻译成机器码(二进制文本),生成目标文件;链接:将所有的目标文件打包链接成一个可执行文件。RISC-V程序的编译过程指定符号的逻辑地址使用链接脚本,例如:OUTPUT_ARCH("riscv")ENTRY(main)SECTIONS{.=0x81000000;.=ALIGN(0x1000);.text:{*(.text)}.=ALIGN(16);.data:{*(.data)}.=ALIGN(16);.bss:{*(.bss)}}代理内核的构造(build)过程采用makefile,简化构造过程,此处摘取makefile的一部分。KERNEL_TARGET=$(OBJ_DIR)/riscv-pkeUSER_TARGET:=$(OBJ_DIR)/app_helloworld……$(KERNEL_TARGET):$(OBJ_DIR)$(UTIL_LIB)$(SPIKE_INF_LIB)$(KERNEL_OBJS)$(KERNEL_LDS)@echo"linking"$@...@$(COMPILE)$(KERNEL_OBJS)$(UTIL_LIB)$(SPIKE_INF_LIB)-o$@-T$(KERNEL_LDS)@echo"PKEcorehasbeenbuiltinto"\"$@\“…….DEFAULT_GOAL:=$(all)all:$(KERNEL_TARGET)$(USER_TARGET).PHONY:all代理内核的构造(build)过程构造过程可概括为:构造util目录下的静态库文件$(OBJ_DIR)/util.a;构造应用程序,得到$(OBJ_DIR)/app_helloworld;构造$(OBJ_DIR)/spike_interface.a,即spike所提供的工具库文件;最后构造代理内核$(OBJ_DIR)/riscv-pke。代理内核的启动过程采用spike模拟器(执行命令):spike./obj/riscv-pke./obj/app_helloworld启动具体过程:在M态执行一系列初始化动作(如HTIF);将中断异常处理“代理”给S态,进入S态;加载程序到内存,将程序封装成一个最简单的“进程”,然后调度执行,同时进入U态。ELF文件(app)的加载过程大致过程为:首先,解析命令行参数,获得需要加载的ELF文件文件名;接下来初始化ELF加载数据结构,并打开即将被加载的ELF文件;加载ELF文件;通过ELF文件提供的入口地址设置进程的“入口地址”,保证“返回”用户态的时候,所加载的ELF文件被执行;关闭ELF文件并返回。spike的HTIF接口

HTIF原理示意图HTIF(HostTargetInterface)是一种通信协议,负责主机与代理内核的通信。主要功能:读/写内存、加载/启动/停止程序等等。中断处理例程当发生一个目标模式为机器模式的中断,RISC-V处理器硬件将执行以下动作:1)保存pc到mepc寄存器;2)将特权级保存到mstatus寄存器的MPP字段;3)将mstatus寄存器中的MIE字段保存到(它自己的)MPIE字段;4)设置mcause,其值与中断向量表中的Interrupt和Exceptioncode对应;5)将pc设置为中断例程的入口,如果为直接模式则设置为mtvec的值;6)将mstatus寄存器的MIE字段清零,转入机器模式。中断处理例程注:在PKE实验中,系统的中断实际上是代理给监管模式处理的,在发生中断时处理器硬件的流程与以上的机器模式类似,只是mepc、mstatus、mcause以及mtvec换成了sepc、sstatus、scause以及stvec。典型的中断处理过程.align6.globalhandler_interrupthandler_interrupt:addisp,sp,-32*REGBYTESSTOREx1,1*REGBYTES(sp)...STOREx31,31*REGBYTES(sp)//callCcodehandlercallsoftware_handler//finishedinterrupthandling,readytoreturnLOADx1,1*REGBYTES(sp)...LOADx31,31*REGBYTES(sp)addisp,sp,32*REGBYTESmret注:处理器在执行mret指令时,将执行以下动作:1)将mstatus寄存器的MPIE字段恢复到该寄存器的MIE字段;2)处理器转换到mstatus寄存器中MPP字段所对应的特权模式;3)将mepc中的内容恢复到pc中。

目录

实验1的基础知识RISC-V程序的编译和链接指定符号的逻辑地址代理内核的构造过程代理内核的启动过程ELF文件(app)的加载过程spike的HTIF接口实验内容lab1_1系统调用lab1_2异常处理lab1_3(外部)中断lab1_1系统调用给定应用预期输出lab1_1系统调用实验内容:给定应用没有实现预期效果,即在屏幕上打印“Helloworld!\n”。实验代码中syscall没有被调用,找到并完成对do_syscall的调用,获得预期的输出结果。lab1_2异常处理给定应用预期输出lab1_2异常处理实验内容:(在用户U模式下执行的)应用企图执行RISC-V的特权指令csrwsscratch,0。该指令会修改S模式的栈指针,如果允许该指令的执行,执行的结果可能会导致系统崩溃。通过调用handle_illegal_instruction函数完成异常指令处理,阻止app_illegal_instruction的执行。lab1_3(外部)中断给定应用预期输出lab1_3(外部)中断实验内容:给定的程序在运行过程中受到了系统的外部时钟中断(timerirq)的“干扰”。而我们在这个实验中给出的PKE操作系统内核,在时钟中断部分并未完全做好,导致(模拟)RISC-V机器碰到第一个时钟中断后就会出现崩溃。完成PKE操作系统内核未完成的时钟中断处理过程,使得它能够完整地处理时钟中断。lab1_challenge1打印用户程序调用栈给定应用预期输出lab1_challenge1打印用户程序调用栈实验内容:通过修改PKE内核,来实现从给定应用(user/app_print_backtrace.c)到预期输出的转换。对于print_backtrace()函数的实现要求:应用程序调用print_backtrace()时,应能够通过控制输入的参数(如例子user/app_print_backtrace.c中的7)控制回溯的层数。例如,如果调用print_backtrace(5)则只输出5层回溯;如果调用print_backtrace(100),则应只回溯到main函数就停止回溯(因为调用的深度小于100)。lab1_challenge2打印异常代码行给定应用预期输出lab1_challenge2打印异常代码行实验内容:通过修改PKE内核(包括machine文件夹下的代码),使得用户程序在发生异常时,内核能够输出触发异常的用户程序的源文件名和对应代码行。文件名规范:需要包含路径,如果是用户源程序发生的错误,路径为相对路径,如果是调用的标准库内发生的错误,路径为绝对路径。为了降低挑战的难度,本实验在elf.c中给出了debug_line段的解析函数make_addr_line。这个函数接受三个参数,ctx为elf文件的上下文指针,这个可以参考文件中的其他函数;debug_line为指向.debug_line段数据的指针,你需要读取elf文件中名为.debug_line的段保存到缓冲区中,然后将缓冲区指针传入这个参数;length为.debug_line段数据的长度。lab1_challenge3多核启动及运行给定应用预期输出lab1_challenge3多核启动及运行实验内容:在RISC-V处理器中,每一个CPU称作一个hart(hardwarethread),并从0开始编号。此实验要求启动两个CPU,它们的编号分别为0和1。本实验中,你需要修改内核代码,使得riscv-pke能够通过spike启动两个CPU(hart),并且让CPU0执行app0,让CPU1执行app1。user0.lds和user1.lds中规定了app0从0x81000000处开始加载,app1从0x81500000处开始加载。kernel/config.h中的NCPU规定了操作系统内核支持的核数,在本实验设置为2,即需要能够通过spike-p2riscv-pkeapp0app1让pke正确地启动两核并发的操作系统并执行app0和app1。内核中有很多使用sprint输出的内容,为了分别每一条输出是哪个核执行的,你需要在相应的sprint处添加一个hartid的输出项。基于RISC-V代理内核的操作系统课程实验与课程设计第四章.实验2:内存管理目录实验2的基础知识Sv39虚地址管理方案回顾物理内存布局与规划PKE操作系统和应用进程的逻辑地址空间结构与页表操作相关的重要函数实验内容lab2_1虚实地址转换lab2_2简单内存分配和回收lab2_3缺页异常实验2的基础知识Sv39虚地址管理方案回顾Sv39中逻辑地址的结构Sv39中PDE/PTE格式Sv39虚地址管理方案回顾Sv39中虚拟地址到物理地址的转换过程Sv39虚地址管理方案回顾satp寄存器格式satp寄存器中MODE域的取值和含义取值虚存方案0Bare8Sv399Sv48物理内存布局与规划对于我们用spike的模拟RISC-V机器而言,2GB的物理内存并不是从0地址开始编址,而是从0x80000000开始编址的。PKE操作系统的逻辑地址空间结构在开启了Sv39虚拟内存管理方案后,所有的逻辑地址到物理地址的翻译都必须通过页表和MMU硬件进行。PKE操作系统内核的逻辑地址空间和它到物理地址空间的映射图PKE应用进程的逻辑地址空间结构lab2_1的应用app_helloworld_no_lds进程在装入后,其逻辑地址空间有4个区间建立了和物理地址空间的映射。用户进程的逻辑地址空间到物理地址空间的映射图与页表操作相关的重要函数1、将逻辑地址映射到物理地址intmap_pages(pagetable_tpage_dir,uint64va,uint64size,uint64pa,intperm);2、查找逻辑地址所在的页表项pte_t*page_walk(pagetable_tpage_dir,uint64va,intalloc);3、查找逻辑地址所在虚拟页面地址对应的物理页面地址uint64lookup_pa(pagetable_tpagetable,uint64va);目录实验2的基础知识Sv39虚地址管理方案回顾物理内存布局与规划PKE操作系统和应用进程的逻辑地址空间结构与页表操作相关的重要函数实验内容lab2_1虚实地址转换lab2_2简单内存分配和回收lab2_3缺页异常lab2_1虚实地址转换给定应用预期输出lab2_1虚实地址转换实验内容:开启Sv39页式地址管理,将应用(app_helloworld_no_lds.c,链接时未指定逻辑地址)投入正常运行。实现user_va_to_pa()函数,完成给定逻辑地址到物理地址的转换,最终使得helloworld程序获得正确输出。lab2_2简单内存分配和回收给定应用预期输出lab2_2简单内存分配和回收实验内容:这里,新定义了两个用户态函数naive_malloc()和naive_free(),它们最终会转换成系统调用,完成内存的分配和回收操作。需要完成naive_free对应的功能,获得预期的输出。lab2_3缺页异常给定应用预期输出lab2_3缺页异常实验内容:应用程序执行时,由于采用递归函数求等差数列的和,递归层数过多,使得用户态栈溢出。本实验中,我们处理的是缺页异常。首先,判断我们处理的确实是缺页异常;判断发生缺页的是不是用户栈空间,如果是则分配一个物理页空间,最后将该空间通过vm_map“粘”到用户栈上以扩充用户栈空间。lab2_challenge1复杂缺页异常给定应用预期输出lab2_challenge1复杂缺页异常实验内容:程序思路基本同lab2_3一致,对给定n计算0到n的和,但要求将每一步递归的结果保存在数组ans中。创建数组时,我们使用了当前的malloc函数申请了一个页面(4KB)的大小,对应可以存储的个数上限为1024。首先由于n足够大,所以在函数递归执行时会触发用户栈的缺页,你需要对其进行正确处理,确保程序正确运行;其次,1025在最后一次计算时会访问数组越界地址,由于该处虚拟地址尚未有对应的物理地址映射,因此属于非法地址的访问,这是不被允许的,对于这种缺页异常,应该提示用户并退出程序执行。lab2_challenge2堆空间管理给定应用预期输出lab2_challenge2堆空间管理实验内容:以上程序先利用better_malloc分别申请100和50个字节的一个物理页的内存,然后使用better_free释放掉100个字节,向50个字节中复制一串字符串,进行输出。原本的pke中malloc的实现是非常简化的(一次直接分配一个页面),你的挑战任务是修改内核(包括machine文件夹下)的代码,使得应用程序的malloc能够在一个物理页中分配,并对各申请块进行合理的管理。通过应用程序和对应的预期结果可以看出:两次申请的空间在同一页面,并且释放第一块时,不会释放整个页面,所以需要你设计合适的数据结构对各块进行管理,使得better_malloc申请的空间更加“紧凑”。lab2_challenge3多核内存管理给定应用预期输出……lab2_challenge3多核内存管理实验内容:

在本次实验中,给定两个程序,每个程序会通过lab2_2实现的naive_malloc申请一些内存页,在内存页开始处写入一个int并打印内存页的虚拟地址。最后每个进程会打印自己写入内存页的数,并通过naive_free释放申请的内存页。app_alloc0.c会依次写入并输出0,1,2,3,4,app_alloc1.c会依次写入并输出5,6,7,8,9。

为了实现这一目的,你需要实现一个自旋锁,并利用自旋锁让多个核并行进行内存的分配和释放。基于RISC-V代理内核的操作系统课程实验与课程设计第五章.实验3:进程管理目录实验3的基础知识多任务环境下进程的封装进程的换入与换出就绪进程的管理与调度实验内容lab3_1进程创建(fork)lab3_2进程yieldlab3_3循环轮转调度实验3的基础知识多任务环境下进程的封装实验三的PKE操作系统将需要支持多个进程的执行。操作系统定义了进程池(processprocs[NPROC];)。并对进程的结构进行了扩充,加入以下成员:mapped_info;//pointstoapagethatcontainsmapped_regionstotal_mapped_region;

//nextfreemappedregioninmapped_infouint64pid;//processid,intstatus;//processstatus,structprocess*parent;//parentprocess,structprocess*queue_next;//nextqueueelement;多任务环境下进程的封装进程可能拥有的段分为以下几个类型:enumsegment_type{CODE_SEGMENT,//ELFsegmentDATA_SEGMENT,//ELFsegmentSTACK_SEGMENT,//runtimesegmentCONTEXT_SEGMENT,//trapframesegmentSYSTEM_SEGMENT,//systemsegment};进程具有以下几种状态:enumproc_status{FREE,//unusedstateREADY,//readystateRUNNING,//currentlyrunningBLOCKED,//waitingforsomethingZOMBIE,//terminatedbutnotreclaimedyet};进程的启动进程启动的步骤:一、调用alloc_process()函数:找到一个空的进程结构体为新创建的进程建立了KERN_BASE以上逻辑地址的映射将映射信息保存到进程结构中二、调用load_bincode_from_host_elf()函数载入给定应用对应的ELF文件的各个段三、调用的elf_load()函数在载入段后,将对被载入的段进行判断,以记录它们的虚地址映射,此时将形成用户进程的虚地址空间结构。四、通过switch_to()函数将所构造的进程投入执行;进程的终止进程的终止通过exit系统调用实现:一、调用free_process(current):将进程设为ZOMBIE状态,而不会将进程所占用的资源全部释放。该函数被调用时操作系统是在S模式下运行,而按照PKE的设计思想,S态的运行将使用当前进程的用户系统栈。此时,如果将当前进程的内存空间进行释放,将导致操作系统本身的崩溃。二、调用schedule()函数:选择系统中可能存在的其他处于就绪状态的进程投入运行。就绪进程的管理与调度PKE的操作系统设计了一个非常简单的就绪队列管理。将一个进程加入就绪队列,可以调用insert_to_ready_queue()函数:若就绪队列为空,将本进程作为就绪队列头。若就绪队列非空,则将本进程加入就绪队尾。PKE内核通过调用schedule()函数来完成进程的选择和换入:若就绪队列空,检查是否存在未结束的进程。如果有,等待期执行结束;如果无,则启动关机程序。若就绪队列非空,将就绪队列队首的进程换入执行。目录实验3的基础知识多任务环境下进程的封装进程的换入与换出就绪进程的管理与调度实验内容lab3_1进程创建(fork)lab3_2进程yieldlab3_3循环轮转调度lab3_1进程创建(fork)给定应用预期输出lab3_1进程创建(fork)实验内容:主进程调用fork()函数试图创建一个子进程,但是应用程序的fork动作并未将子进程给创建出来并投入运行。修改kernel/process.c文件中的do_fork()函数。对于父进程的代码段,通过映射的办法,将子进程中对应的逻辑地址空间映射到其父进程中装载代码段的物理页面。lab3_2进程yield给定应用预期输出lab3_2进程yield实验内容:yield()函数功能未完善导致使得进程无法让出执行权。完善yield()函数实现进程执行过程中的主动释放CPU的动作:将当前进程置为就绪状态(READY);将当前进程加入到就绪队列的队尾;转进程调度。lab3_3循环轮转调度给定应用预期输出lab3_3循环轮转调度实验内容:两个进程在执行各自循环体时,都没有主动释放CPU的动作。这样的设计会导致某个进程长期占据CPU,而另一个进程无法得到执行。通过利用时钟中断来实现进程的循环轮转调度,避免由于一个进程的执行体过长,导致系统中其他进程无法得到调度的问题!lab3_challenge1进程等待和数据段复制给定应用预期输出lab3_challenge1进程等待和数据段复制实验内容:通过修改PKE内核和系统调用,为用户程序提供wait函数的功能,wait函数接受一个参数pid:当pid为-1时,父进程等待任意一个子进程退出即返回子进程的pid;当pid大于0时,父进程等待进程号为pid的子进程退出即返回子进程的pid;如果pid不合法或pid大于0且pid对应的进程不是当前进程的子进程,返回-1。补充do_fork函数,实验3_1实现了代码段的复制,你需要继续实现数据段的复制并保证fork后父子进程的数据段相互独立。lab3_challenge2实现信号量给定应用预期输出……lab3_challenge2实现信号量实验内容:以上程序通过信号量的增减,控制主进程和两个子进程的输出按主进程,第一个子进程,第二个子进程,主进程,第一个子进程,第二个子进程……这样的顺序轮流输出。为了实现进程同步功能,你需要实现信号量的分配、释放和PV操作。lab3_challenge3写时复制(CopyOnWrite)给定应用预期输出……lab3_challenge3写时复制(CopyOnWrite)实验内容:以上程序执行如下操作:在父进程的堆上申请一片区域,并输出其物理地址;进行fork操作,输出子进程在对堆数据写入前后对应的物理地址。若未实现cow,子进程物理页面地址在写入前后都与父进程不同,因为堆空间在fork时就被完整复制了。正确实现cow后,子进程写入前物理页面地址与父进程相同(仅映射未复制),写入后物理页面地址与父进程不同(写入时触发页面复制)。基于RISC-V代理内核的操作系统课程实验与课程设计第六章.实验4:文件系统目录实验4的基础知识PKE文件系统架构文件系统提供的接口虚拟文件系统VFSRFS文件系统实验内容lab4_1文件操作lab4_2目录文件lab4_3硬链接实验4的基础知识PKElab4的设计目标:为PKE添加文件系统支持PKE的文件系统应该:1.为进程提供合适的接口;2.支持VFS,以同时实现对hostfs文件和定制文件系统的访

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论