計算機操作系統(tǒng)實驗指導-基于RISC-V代理內核 課件全套 第1-6章 RISC-V體系結構-實驗4:文件系統(tǒng)_第1頁
計算機操作系統(tǒng)實驗指導-基于RISC-V代理內核 課件全套 第1-6章 RISC-V體系結構-實驗4:文件系統(tǒng)_第2頁
計算機操作系統(tǒng)實驗指導-基于RISC-V代理內核 課件全套 第1-6章 RISC-V體系結構-實驗4:文件系統(tǒng)_第3頁
計算機操作系統(tǒng)實驗指導-基于RISC-V代理內核 課件全套 第1-6章 RISC-V體系結構-實驗4:文件系統(tǒng)_第4頁
計算機操作系統(tǒng)實驗指導-基于RISC-V代理內核 課件全套 第1-6章 RISC-V體系結構-實驗4:文件系統(tǒng)_第5頁
已閱讀5頁,還剩133頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于RISC-V代理內核的操作系統(tǒng)課程實驗與課程設計第一章RISC-V體系結構目錄RISC-V簡介代理內核簡介相關工具軟件RISC-V簡介RISC-V是一種典型的精簡(ReducedInstructionSetComputer,簡寫為RISC)指令集,開放的指令集。該項目2010年始于加州大學伯克利分校,但許多貢獻者是該大學以外的志愿者和行業(yè)工作者。RISC-V指令集后發(fā)優(yōu)勢:借鑒了之前的傳統(tǒng)商業(yè)指令集,取長補短。開放架構:開放指令集,自由使用。場景豐富:指令集的設計綜合考慮了多種應用場景。開源參考:(RISC-V處理器的)開源實現(xiàn)眾多。RISC-V指令集的分類基本整數(shù)指令集:RV32I、RV64I、RV128I。擴展指令集指令集:見右表指令集簡寫慣例:如RV64IMAF、RV64G(G=I+M+A+F)簡稱描述M整數(shù)乘除法標準擴展A不可中斷指令標準擴展F單精確度浮點運算標準擴展D雙倍精確度浮點運算標準擴展G所有以上的擴展指令集以及基本指令集的總和的簡稱Q四倍精確度浮點運算標準擴展L十進制浮點運算標準擴展C壓縮指令標準擴展B位操作標準擴展J動態(tài)指令翻譯標準擴展T順序存儲器訪問標準擴展P單指令多數(shù)據(jù)流運算標準擴充V向量運算標準擴充N用戶級別中斷標準擴充常用擴展指令集

RV64G機器的匯編語言

寄存器:通用寄存器見右表其他寄存器:如pc、狀態(tài)寄存器寄存器編程接口名稱(ABI)描述使用x0zeroHard-wiredzero硬件零x1raReturnaddress常用于保存(函數(shù)的)返回地址x2spStackpointer棧頂指針x3gpGlobalpointer—x4tpThreadpointer—x5-7t0-2Temporary臨時寄存器x8s0/fpSavedRegister/Framepointer(函數(shù)調用時)保存的寄存器和棧頂指針x9s1Savedregister(函數(shù)調用時)保存的寄存器x10-11a0-1Functionargument/returnvalue(函數(shù)調用時)的參數(shù)/函數(shù)的返回值x12-17a2-7Functionargument(函數(shù)調用時)的參數(shù)x18-27s2-11Savedregister(函數(shù)調用時)保存的寄存器x28-31t3-6Temporary臨時寄存器32個通用寄存器指令格式RV64I的指令分類:整數(shù)指令:add、sub、and、or、sll、slr、lui等。訪存指令:lb、lh、lw、ld、sb、sh等??刂妻D移指令:be、bne、bge、jalr等。指令格式(以加法指令add為例):addrd,rs1,rs2加法指令編碼指令命名規(guī)則(PKE中用到的)常見指令:lw、sw、ld、sd、addi、mul、jr、call、ret等。用戶態(tài)指令級特權指令級訪存和尋址模式在內存訪問上,RISC-V提供的接口(相比于8086匯編)極其簡單:讀內存(load):例如ldrd,offset(rs1)

寫內存(store):例如swrs2,offset(rs1)注:RISC-V采用小端字節(jié)序。如將0x1234ABCD寫入0x800地址后,各個地址的數(shù)據(jù)如下:[0x00000800]=0xCD;[0x00000801]=0xAB[0x00000802]=0x34;[0x00000803]=0x12C語言內嵌匯編基本內聯(lián)匯編語句: asm(“statements”);擴展內聯(lián)匯編: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"http://破壞描述部分);機器的特權狀態(tài)三種特權狀態(tài)的切換Machine模式下的CSR寄存器作用mscratchMachineScratch。保存機器模式的棧頂指針,這一點在離開機器模式進入低特權級模式(如監(jiān)管模式)時非常重要,因為一旦在低特權級模式發(fā)生異常,將可能會回到機器模式處理,這時機器模式需要有自己的棧來保存M模式下的執(zhí)行所調用的函數(shù)參數(shù)和返回地址。mstatusMachineStatus。保存機器狀態(tài)的寄存器。mtvecMachineTrapVector。指向中斷處理函數(shù)的入口地址。mepcMachineExceptionPC。指向發(fā)生異常的那條指令的地址。mcauseMachineCause。發(fā)生中斷的原因,如果發(fā)生的中斷是異常,其最高位為0,低位為異常編號;如果發(fā)生的是其他類型的中斷,則其最高位為1,低位為中斷編號。mtvalMachineTrapValue。異常發(fā)生時,附帶的參數(shù)值。例如,當缺頁異常發(fā)生時,mtval的值就是程序想要訪問的虛地址。mieMachineInterruptEnable。中斷開啟寄存器。mipMachineInterruptPending。中斷等待寄存器。midelegMachineInterruptDelegationRegisters。中斷代理寄存器。medelegMachineExceptionDelegationRegisters。異常代理寄存器。Machine模式下的mstatusMIE,SIE,UIE:中斷使能位。MPIE,SPIE,UPIE:中斷使能保存位。SPP,MPP:發(fā)生中斷異常之前的機器模式。MPRV,MXR,SUM:訪存控制相關位。mstatus寄存器Supervisor模式下的CSR寄存器作用sscratchSupervisorScratch。保存監(jiān)管模式的棧頂指針,這一點在離開機器模式進入低特權級模式(如用戶模式)時非常重要,因為一旦在低特權級模式發(fā)生異常,將可能會回到監(jiān)管模式處理(假設已通過異常授權),這時監(jiān)管模式需要用自己的棧保存程序執(zhí)行的返回地址等。sstatusSupervisorStatus。保存監(jiān)管狀態(tài)的寄存器。stvecSupervisorTrapVector。指向監(jiān)管模式中斷處理函數(shù)的入口地址。sepcSupervisorExceptionPC。指向發(fā)生異常的那條指令的地址。scauseSupervisorCause。發(fā)生中斷的原因,如果發(fā)生的中斷是異常,其最高位為0,低位為異常編號;如果發(fā)生的是其他中斷其最高位為1,低位為中斷編號。stvalSupervisorTrapValue。異常發(fā)生時,附帶的參數(shù)值。例如,當缺頁異常發(fā)生時,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(即我們通常理解的“系統(tǒng)調用”或者“軟件中斷”)。

Interrupt:一般由外部設備產生。中斷示意圖中斷向量表InterruptCode中斷描述13Machinesoftwareinterrupt17Machinetimerinterrupt111Machineexternalinterrupt1>=16Implementationdefinedlocalinterrupts02IllegalInstruction08EnvironmentcallfromU-mode09EnvironmentcallfromS-mode013Loadpagefault015Store/AMOpagefault中斷向量表(部分)中斷處理通常包括以下幾個步驟:中斷請求:在中斷請求被響應之前會一直發(fā)送中斷請求。中斷源識別:當系統(tǒng)同時有多個中斷源發(fā)出的中斷請求時,系統(tǒng)往往只能相應并處理一個中斷,這就要求CPU對來到的中斷請求進行判優(yōu),選擇出同一時間優(yōu)先級最高的給予響應和處理。中斷響應:中斷響應時,CPU要向中斷源發(fā)出中斷響應信號。中斷處理:保護軟件現(xiàn)場(把中斷服務子程序中要用到的寄存器的內容壓入堆棧)、開中斷(為了可以嵌套)、執(zhí)行中斷處理程序、關中斷、恢復現(xiàn)場。中斷返回:返回到中斷前程序執(zhí)行位置的下一條指令。中斷處理過程RISC-V的中斷代理機制RISC-V可以將系統(tǒng)中的特定中斷或者異常,通過設置較高特權級的CSR寄存器,“代理給”某個更低的特權級處理。機器模式“代理”給監(jiān)管模式監(jiān)管模式“代理”給用戶模式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);頁式虛存管理為了實現(xiàn)程序邏輯地址到物理地址的轉換,采用RV64G指令集的RISC-V處理器在監(jiān)管模式提供了三種方式(

也稱VMM):Bare:物理內存地址等于虛擬內存地址;Sv39:支持39位邏輯地址;Sv48:Sv39的簡單擴展。Sv39中的物理地址與邏輯地址Sv39中邏輯地址的結構Sv39中PDE/PTE格式

Sv39中虛擬地址到物理地址的轉換過程

Sv39中虛擬地址到物理地址的轉換過程示意圖satpsatp寄存器格式satp寄存器中MODE域的取值和含義取值虛存方案0Bare8Sv399Sv48目錄RISC-V簡介代理內核簡介相關工具軟件

代理內核

代理內核的概念代理內核是一種輕量級的應用程序執(zhí)行環(huán)境,可以承載靜態(tài)鏈接的RISC-VELF文件。代理內核的工作適配的場景是,既有主機(host)又有目標機(target)的場景。代理內核并非獨立存在的系統(tǒng),它不具有獨自的IO實現(xiàn),而是將IO功能代理到Host主機上。它可以看成是操作系統(tǒng)的一個極小集,為應用提供最基本的操作系統(tǒng)支撐,使得應用可以在只具備核心資源(包括處理器、內存)的裸機上運行。

代理內核

代理內核與主機內核的交互代理內核的主要功能通過前端服務器(frontendserver,fesvr)和HTIF(Host/TargetInterface)實現(xiàn)。fesvr是ARM端系統(tǒng)上運行的程序,控制PKE的啟動。其主要分為兩個模塊:系統(tǒng)調用模塊負責接受PKE對ARM端的系統(tǒng)調用請求,在ARM端執(zhí)行這些函數(shù);內存模塊負責讀寫RISCV端的內存,和PKE交換數(shù)據(jù)。代理內核的實際應用PKE的設備和文件實驗內容(lab5)注:lab1~4屬于操作系統(tǒng)實驗,lab5屬于《系統(tǒng)能力培養(yǎng)綜合訓練——藍牙小車》課程。目錄RISC-V簡介代理內核簡介相關工具軟件相關工具軟件git:開源的分布式版本控制系統(tǒng)gitinitgitadd*.cgitcommit-m‘myversion1’gitcloneurlgitstatusgitbranchgitcheckout-bdevorigin/degitpushorigingitloggit倉庫中文件的狀態(tài)轉換相關工具軟件RISC-V交叉編譯器riscv64-unknown-elf-gccriscv64-unknown-elf-objdumpriscv64-unknown-elf-asRISC-V模擬器spike常見Linux命令如file等命令對相關工具軟件的要求會用!了解git命令各開關的用途了解交叉編譯器中工具軟件的用途第二章實驗環(huán)境配置與實驗構成

基于RISC-V代理內核的操作系統(tǒng)課程實驗與課程設計

目錄

實驗環(huán)境安裝安裝操作系統(tǒng)環(huán)境安裝執(zhí)行支撐軟件頭歌平臺實驗代碼的獲取PKE實驗構成

2.1實驗環(huán)境安裝

安裝操作系統(tǒng)環(huán)境:WindowsSubversionLinux(WSL)Ubuntu或者其他Linux發(fā)行版頭歌實驗平臺(無需安裝)安裝執(zhí)行支撐軟件注:PKE實驗涉及到的執(zhí)行支撐軟件有:RISC-V交叉編譯器(及附帶的主機編譯器、構造工具等);spike模擬器。方案一:下載自包含交叉編譯器+執(zhí)行環(huán)境第一步,安裝依賴庫第二步,下載自包含交叉編譯器+執(zhí)行環(huán)境第三步,設置環(huán)境變量安裝執(zhí)行支撐軟件方案二:完整自行構建交叉編譯器和執(zhí)行環(huán)境第一步,安裝依賴庫第二步,獲取RISC-V交叉編譯器的源代碼第三步,構建(build)RISC-V交叉編譯器第四步,設置環(huán)境變量第五步,安裝spike模擬器頭歌平臺第一步:搜索課程頭歌主頁截圖頭歌平臺第二步:進入課程頭歌網頁截圖頭歌平臺第三步:進入實戰(zhàn)頭歌網頁截圖頭歌平臺第四步:開始實戰(zhàn)頭歌網頁截圖

目錄

實驗環(huán)境安裝安裝操作系統(tǒng)環(huán)境安裝執(zhí)行支撐軟件頭歌平臺實驗代碼的獲取PKE實驗構成

實驗代碼的獲取

對于頭歌平臺而言,無需自己獲取代碼。對于其他方式(自安裝系統(tǒng))需要使用git命令從gitee上獲取代碼命令:$gitclone/hustos/riscv-pke.git通過人民郵電出版社的書籍官網下載參考《實驗指導》書內說明

目錄

實驗環(huán)境安裝安裝操作系統(tǒng)環(huán)境安裝執(zhí)行支撐軟件頭歌平臺實驗代碼的獲取PKE實驗構成

2.3PKE實驗的組成

PKE實驗由4組基礎實驗以及基礎試驗后的挑戰(zhàn)實驗組成:基礎實驗:第一組基礎實驗重點涉及系統(tǒng)調用、異常和外部中斷的知識;第二組基礎實驗重點涉及主存管理方面的知識;第三組基礎實驗重點涉及進程管理方面的知識;第四組基礎實驗重點設計文件系統(tǒng)方面的知識。挑戰(zhàn)實驗:每一組實驗的挑戰(zhàn)實驗都可以理解為在該組實驗上的挑戰(zhàn)性內容。

PKE實驗的組成

PKE實驗的組織結構《操作系統(tǒng)》實驗和課程設計安排(建議)課內實驗(16學時)基礎內容:PKE基礎實驗(lab1_1~lab4_3)挑戰(zhàn)實驗:lab1_challenge1、lab2_challenge1、lab3_challenge1、lab4_challenge1課程設計(2周)挑戰(zhàn)實驗:

lab1_challenge2、lab2_challenge2、lab3_challenge2、lab4_challenge2、lab1_challenge3、lab2_challenge3、lab3_challenge3、lab4_challenge3基于RISC-V代理內核的操作系統(tǒng)課程實驗與課程設計第三章.實驗1:系統(tǒng)調用、異常和外部中斷

目錄

實驗1的基礎知識RISC-V程序的編譯和鏈接指定符號的邏輯地址代理內核的構造過程代理內核的啟動過程ELF文件(app)的加載過程spike的HTIF接口實驗內容lab1_1系統(tǒng)調用lab1_2異常處理lab1_3(外部)中斷3.1實驗1的基礎知識RISC-V程序編譯主要過程:預處理:展開頭文件、宏替換、條件編譯、刪除注釋等等;編譯:語法檢查;匯編:將匯編文件翻譯成機器碼(二進制文本),生成目標文件;鏈接:將所有的目標文件打包鏈接成一個可執(zhí)行文件。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目錄下的靜態(tài)庫文件$(OBJ_DIR)/util.a;構造應用程序,得到$(OBJ_DIR)/app_helloworld;構造$(OBJ_DIR)/spike_interface.a,即spike所提供的工具庫文件;最后構造代理內核$(OBJ_DIR)/riscv-pke。代理內核的啟動過程采用spike模擬器(執(zhí)行命令):spike./obj/riscv-pke./obj/app_helloworld啟動具體過程:在M態(tài)執(zhí)行一系列初始化動作(如HTIF);將中斷異常處理“代理”給S態(tài),進入S態(tài);加載程序到內存,將程序封裝成一個最簡單的“進程”,然后調度執(zhí)行,同時進入U態(tài)。ELF文件(app)的加載過程大致過程為:首先,解析命令行參數(shù),獲得需要加載的ELF文件文件名;接下來初始化ELF加載數(shù)據(jù)結構,并打開即將被加載的ELF文件;加載ELF文件;通過ELF文件提供的入口地址設置進程的“入口地址”,保證“返回”用戶態(tài)的時候,所加載的ELF文件被執(zhí)行;關閉ELF文件并返回。spike的HTIF接口

HTIF原理示意圖HTIF(HostTargetInterface)是一種通信協(xié)議,負責主機與代理內核的通信。主要功能:讀/寫內存、加載/啟動/停止程序等等。中斷處理例程當發(fā)生一個目標模式為機器模式的中斷,RISC-V處理器硬件將執(zhí)行以下動作:1)保存pc到mepc寄存器;2)將特權級保存到mstatus寄存器的MPP字段;3)將mstatus寄存器中的MIE字段保存到(它自己的)MPIE字段;4)設置mcause,其值與中斷向量表中的Interrupt和Exceptioncode對應;5)將pc設置為中斷例程的入口,如果為直接模式則設置為mtvec的值;6)將mstatus寄存器的MIE字段清零,轉入機器模式。中斷處理例程注:在PKE實驗中,系統(tǒng)的中斷實際上是代理給監(jiān)管模式處理的,在發(fā)生中斷時處理器硬件的流程與以上的機器模式類似,只是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注:處理器在執(zhí)行mret指令時,將執(zhí)行以下動作:1)將mstatus寄存器的MPIE字段恢復到該寄存器的MIE字段;2)處理器轉換到mstatus寄存器中MPP字段所對應的特權模式;3)將mepc中的內容恢復到pc中。

目錄

實驗1的基礎知識RISC-V程序的編譯和鏈接指定符號的邏輯地址代理內核的構造過程代理內核的啟動過程ELF文件(app)的加載過程spike的HTIF接口實驗內容lab1_1系統(tǒng)調用lab1_2異常處理lab1_3(外部)中斷l(xiāng)ab1_1系統(tǒng)調用給定應用預期輸出lab1_1系統(tǒng)調用實驗內容:給定應用沒有實現(xiàn)預期效果,即在屏幕上打印“Helloworld!\n”。實驗代碼中syscall沒有被調用,找到并完成對do_syscall的調用,獲得預期的輸出結果。lab1_2異常處理給定應用預期輸出lab1_2異常處理實驗內容:(在用戶U模式下執(zhí)行的)應用企圖執(zhí)行RISC-V的特權指令csrwsscratch,0。該指令會修改S模式的棧指針,如果允許該指令的執(zhí)行,執(zhí)行的結果可能會導致系統(tǒng)崩潰。通過調用handle_illegal_instruction函數(shù)完成異常指令處理,阻止app_illegal_instruction的執(zhí)行。lab1_3(外部)中斷給定應用預期輸出lab1_3(外部)中斷實驗內容:給定的程序在運行過程中受到了系統(tǒng)的外部時鐘中斷(timerirq)的“干擾”。而我們在這個實驗中給出的PKE操作系統(tǒng)內核,在時鐘中斷部分并未完全做好,導致(模擬)RISC-V機器碰到第一個時鐘中斷后就會出現(xiàn)崩潰。完成PKE操作系統(tǒng)內核未完成的時鐘中斷處理過程,使得它能夠完整地處理時鐘中斷。lab1_challenge1打印用戶程序調用棧給定應用預期輸出lab1_challenge1打印用戶程序調用棧實驗內容:通過修改PKE內核,來實現(xiàn)從給定應用(user/app_print_backtrace.c)到預期輸出的轉換。對于print_backtrace()函數(shù)的實現(xiàn)要求:應用程序調用print_backtrace()時,應能夠通過控制輸入的參數(shù)(如例子user/app_print_backtrace.c中的7)控制回溯的層數(shù)。例如,如果調用print_backtrace(5)則只輸出5層回溯;如果調用print_backtrace(100),則應只回溯到main函數(shù)就停止回溯(因為調用的深度小于100)。lab1_challenge2打印異常代碼行給定應用預期輸出lab1_challenge2打印異常代碼行實驗內容:通過修改PKE內核(包括machine文件夾下的代碼),使得用戶程序在發(fā)生異常時,內核能夠輸出觸發(fā)異常的用戶程序的源文件名和對應代碼行。文件名規(guī)范:需要包含路徑,如果是用戶源程序發(fā)生的錯誤,路徑為相對路徑,如果是調用的標準庫內發(fā)生的錯誤,路徑為絕對路徑。為了降低挑戰(zhàn)的難度,本實驗在elf.c中給出了debug_line段的解析函數(shù)make_addr_line。這個函數(shù)接受三個參數(shù),ctx為elf文件的上下文指針,這個可以參考文件中的其他函數(shù);debug_line為指向.debug_line段數(shù)據(jù)的指針,你需要讀取elf文件中名為.debug_line的段保存到緩沖區(qū)中,然后將緩沖區(qū)指針傳入這個參數(shù);length為.debug_line段數(shù)據(jù)的長度。lab1_challenge3多核啟動及運行給定應用預期輸出lab1_challenge3多核啟動及運行實驗內容:在RISC-V處理器中,每一個CPU稱作一個hart(hardwarethread),并從0開始編號。此實驗要求啟動兩個CPU,它們的編號分別為0和1。本實驗中,你需要修改內核代碼,使得riscv-pke能夠通過spike啟動兩個CPU(hart),并且讓CPU0執(zhí)行app0,讓CPU1執(zhí)行app1。user0.lds和user1.lds中規(guī)定了app0從0x81000000處開始加載,app1從0x81500000處開始加載。kernel/config.h中的NCPU規(guī)定了操作系統(tǒng)內核支持的核數(shù),在本實驗設置為2,即需要能夠通過spike-p2riscv-pkeapp0app1讓pke正確地啟動兩核并發(fā)的操作系統(tǒng)并執(zhí)行app0和app1。內核中有很多使用sprint輸出的內容,為了分別每一條輸出是哪個核執(zhí)行的,你需要在相應的sprint處添加一個hartid的輸出項?;赗ISC-V代理內核的操作系統(tǒng)課程實驗與課程設計第四章.實驗2:內存管理目錄實驗2的基礎知識Sv39虛地址管理方案回顧物理內存布局與規(guī)劃PKE操作系統(tǒng)和應用進程的邏輯地址空間結構與頁表操作相關的重要函數(shù)實驗內容lab2_1虛實地址轉換lab2_2簡單內存分配和回收lab2_3缺頁異常實驗2的基礎知識Sv39虛地址管理方案回顧Sv39中邏輯地址的結構Sv39中PDE/PTE格式Sv39虛地址管理方案回顧Sv39中虛擬地址到物理地址的轉換過程Sv39虛地址管理方案回顧satp寄存器格式satp寄存器中MODE域的取值和含義取值虛存方案0Bare8Sv399Sv48物理內存布局與規(guī)劃對于我們用spike的模擬RISC-V機器而言,2GB的物理內存并不是從0地址開始編址,而是從0x80000000開始編址的。PKE操作系統(tǒng)的邏輯地址空間結構在開啟了Sv39虛擬內存管理方案后,所有的邏輯地址到物理地址的翻譯都必須通過頁表和MMU硬件進行。PKE操作系統(tǒng)內核的邏輯地址空間和它到物理地址空間的映射圖PKE應用進程的邏輯地址空間結構lab2_1的應用app_helloworld_no_lds進程在裝入后,其邏輯地址空間有4個區(qū)間建立了和物理地址空間的映射。用戶進程的邏輯地址空間到物理地址空間的映射圖與頁表操作相關的重要函數(shù)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虛地址管理方案回顧物理內存布局與規(guī)劃PKE操作系統(tǒng)和應用進程的邏輯地址空間結構與頁表操作相關的重要函數(shù)實驗內容lab2_1虛實地址轉換lab2_2簡單內存分配和回收lab2_3缺頁異常lab2_1虛實地址轉換給定應用預期輸出lab2_1虛實地址轉換實驗內容:開啟Sv39頁式地址管理,將應用(app_helloworld_no_lds.c,鏈接時未指定邏輯地址)投入正常運行。實現(xiàn)user_va_to_pa()函數(shù),完成給定邏輯地址到物理地址的轉換,最終使得helloworld程序獲得正確輸出。lab2_2簡單內存分配和回收給定應用預期輸出lab2_2簡單內存分配和回收實驗內容:這里,新定義了兩個用戶態(tài)函數(shù)naive_malloc()和naive_free(),它們最終會轉換成系統(tǒng)調用,完成內存的分配和回收操作。需要完成naive_free對應的功能,獲得預期的輸出。lab2_3缺頁異常給定應用預期輸出lab2_3缺頁異常實驗內容:應用程序執(zhí)行時,由于采用遞歸函數(shù)求等差數(shù)列的和,遞歸層數(shù)過多,使得用戶態(tài)棧溢出。本實驗中,我們處理的是缺頁異常。首先,判斷我們處理的確實是缺頁異常;判斷發(fā)生缺頁的是不是用戶??臻g,如果是則分配一個物理頁空間,最后將該空間通過vm_map“粘”到用戶棧上以擴充用戶??臻g。lab2_challenge1復雜缺頁異常給定應用預期輸出lab2_challenge1復雜缺頁異常實驗內容:程序思路基本同lab2_3一致,對給定n計算0到n的和,但要求將每一步遞歸的結果保存在數(shù)組ans中。創(chuàng)建數(shù)組時,我們使用了當前的malloc函數(shù)申請了一個頁面(4KB)的大小,對應可以存儲的個數(shù)上限為1024。首先由于n足夠大,所以在函數(shù)遞歸執(zhí)行時會觸發(fā)用戶棧的缺頁,你需要對其進行正確處理,確保程序正確運行;其次,1025在最后一次計算時會訪問數(shù)組越界地址,由于該處虛擬地址尚未有對應的物理地址映射,因此屬于非法地址的訪問,這是不被允許的,對于這種缺頁異常,應該提示用戶并退出程序執(zhí)行。lab2_challenge2堆空間管理給定應用預期輸出lab2_challenge2堆空間管理實驗內容:以上程序先利用better_malloc分別申請100和50個字節(jié)的一個物理頁的內存,然后使用better_free釋放掉100個字節(jié),向50個字節(jié)中復制一串字符串,進行輸出。原本的pke中malloc的實現(xiàn)是非常簡化的(一次直接分配一個頁面),你的挑戰(zhàn)任務是修改內核(包括machine文件夾下)的代碼,使得應用程序的malloc能夠在一個物理頁中分配,并對各申請塊進行合理的管理。通過應用程序和對應的預期結果可以看出:兩次申請的空間在同一頁面,并且釋放第一塊時,不會釋放整個頁面,所以需要你設計合適的數(shù)據(jù)結構對各塊進行管理,使得better_malloc申請的空間更加“緊湊”。lab2_challenge3多核內存管理給定應用預期輸出……lab2_challenge3多核內存管理實驗內容:

在本次實驗中,給定兩個程序,每個程序會通過lab2_2實現(xiàn)的naive_malloc申請一些內存頁,在內存頁開始處寫入一個int并打印內存頁的虛擬地址。最后每個進程會打印自己寫入內存頁的數(shù),并通過naive_free釋放申請的內存頁。app_alloc0.c會依次寫入并輸出0,1,2,3,4,app_alloc1.c會依次寫入并輸出5,6,7,8,9。

為了實現(xiàn)這一目的,你需要實現(xiàn)一個自旋鎖,并利用自旋鎖讓多個核并行進行內存的分配和釋放。基于RISC-V代理內核的操作系統(tǒng)課程實驗與課程設計第五章.實驗3:進程管理目錄實驗3的基礎知識多任務環(huán)境下進程的封裝進程的換入與換出就緒進程的管理與調度實驗內容lab3_1進程創(chuàng)建(fork)lab3_2進程yieldlab3_3循環(huán)輪轉調度實驗3的基礎知識多任務環(huán)境下進程的封裝實驗三的PKE操作系統(tǒng)將需要支持多個進程的執(zhí)行。操作系統(tǒng)定義了進程池(processprocs[NPROC];)。并對進程的結構進行了擴充,加入以下成員:mapped_info;//pointstoapagethatcontainsmapped_regionstotal_mapped_region;

//nextfreemappedregioninmapped_infouint64pid;//processid,intstatus;//processstatus,structprocess*parent;//parentprocess,structprocess*queue_next;//nextqueueelement;多任務環(huán)境下進程的封裝進程可能擁有的段分為以下幾個類型:enumsegment_type{CODE_SEGMENT,//ELFsegmentDATA_SEGMENT,//ELFsegmentSTACK_SEGMENT,//runtimesegmentCONTEXT_SEGMENT,//trapframesegmentSYSTEM_SEGMENT,//systemsegment};進程具有以下幾種狀態(tài):enumproc_status{FREE,//unusedstateREADY,//readystateRUNNING,//currentlyrunningBLOCKED,//waitingforsomethingZOMBIE,//terminatedbutnotreclaimedyet};進程的啟動進程啟動的步驟:一、調用alloc_process()函數(shù):找到一個空的進程結構體為新創(chuàng)建的進程建立了KERN_BASE以上邏輯地址的映射將映射信息保存到進程結構中二、調用load_bincode_from_host_elf()函數(shù)載入給定應用對應的ELF文件的各個段三、調用的elf_load()函數(shù)在載入段后,將對被載入的段進行判斷,以記錄它們的虛地址映射,此時將形成用戶進程的虛地址空間結構。四、通過switch_to()函數(shù)將所構造的進程投入執(zhí)行;進程的終止進程的終止通過exit系統(tǒng)調用實現(xiàn):一、調用free_process(current):將進程設為ZOMBIE狀態(tài),而不會將進程所占用的資源全部釋放。該函數(shù)被調用時操作系統(tǒng)是在S模式下運行,而按照PKE的設計思想,S態(tài)的運行將使用當前進程的用戶系統(tǒng)棧。此時,如果將當前進程的內存空間進行釋放,將導致操作系統(tǒng)本身的崩潰。二、調用schedule()函數(shù):選擇系統(tǒng)中可能存在的其他處于就緒狀態(tài)的進程投入運行。就緒進程的管理與調度PKE的操作系統(tǒng)設計了一個非常簡單的就緒隊列管理。將一個進程加入就緒隊列,可以調用insert_to_ready_queue()函數(shù):若就緒隊列為空,將本進程作為就緒隊列頭。若就緒隊列非空,則將本進程加入就緒隊尾。PKE內核通過調用schedule()函數(shù)來完成進程的選擇和換入:若就緒隊列空,檢查是否存在未結束的進程。如果有,等待期執(zhí)行結束;如果無,則啟動關機程序。若就緒隊列非空,將就緒隊列隊首的進程換入執(zhí)行。目錄實驗3的基礎知識多任務環(huán)境下進程的封裝進程的換入與換出就緒進程的管理與調度實驗內容lab3_1進程創(chuàng)建(fork)lab3_2進程yieldlab3_3循環(huán)輪轉調度lab3_1進程創(chuàng)建(fork)給定應用預期輸出lab3_1進程創(chuàng)建(fork)實驗內容:主進程調用fork()函數(shù)試圖創(chuàng)建一個子進程,但是應用程序的fork動作并未將子進程給創(chuàng)建出來并投入運行。修改kernel/process.c文件中的do_fork()函數(shù)。對于父進程的代碼段,通過映射的辦法,將子進程中對應的邏輯地址空間映射到其父進程中裝載代碼段的物理頁面。lab3_2進程yield給定應用預期輸出lab3_2進程yield實驗內容:yield()函數(shù)功能未完善導致使得進程無法讓出執(zhí)行權。完善yield()函數(shù)實現(xiàn)進程執(zhí)行過程中的主動釋放CPU的動作:將當前進程置為就緒狀態(tài)(READY);將當前進程加入到就緒隊列的隊尾;轉進程調度。lab3_3循環(huán)輪轉調度給定應用預期輸出lab3_3循環(huán)輪轉調度實驗內容:兩個進程在執(zhí)行各自循環(huán)體時,都沒有主動釋放CPU的動作。這樣的設計會導致某個進程長期占據(jù)CPU,而另一個進程無法得到執(zhí)行。通過利用時鐘中斷來實現(xiàn)進程的循環(huán)輪轉調度,避免由于一個進程的執(zhí)行體過長,導致系統(tǒng)中其他進程無法得到調度的問題!lab3_challenge1進程等待和數(shù)據(jù)段復制給定應用預期輸出lab3_challenge1進程等待和數(shù)據(jù)段復制實驗內容:通過修改PKE內核和系統(tǒng)調用,為用戶程序提供wait函數(shù)的功能,wait函數(shù)接受一個參數(shù)pid:當pid為-1時,父進程等待任意一個子進程退出即返回子進程的pid;當pid大于0時,父進程等待進程號為pid的子進程退出即返回子進程的pid;如果pid不合法或pid大于0且pid對應的進程不是當前進程的子進程,返回-1。補充do_fork函數(shù),實驗3_1實現(xiàn)了代碼段的復制,你需要繼續(xù)實現(xiàn)數(shù)據(jù)段的復制并保證fork后父子進程的數(shù)據(jù)段相互獨立。lab3_challenge2實現(xiàn)信號量給定應用預期輸出……lab3_challenge2實現(xiàn)信號量實驗內容:以上程序通過信號量的增減,控制主進程和兩個子進程的輸出按主進程,第一個子進程,第二個子進程,主進程,第一個子進程,第二個子進程……這樣的順序輪流輸出。為了實現(xiàn)進程同步功能,你需要實現(xiàn)信號量的分配、釋放和PV操作。lab3_challenge3寫時復制(CopyOnWrite)給定應用預期輸出……lab3_challenge3寫時復制(CopyOnWrite)實驗內容:以上程序執(zhí)行如下操作:在父進程的堆上申請一片區(qū)域,并輸出其物理地址;進行fork操作,輸出子進程在對堆數(shù)據(jù)寫入前后對應的物理地址。若未實現(xiàn)cow,子進程物理頁面地址在寫入前后都與父進程不同,因為堆空間在fork時就被完整復制了。正確實現(xiàn)cow后,子進程寫入前物理頁面地址與父進程相同(僅映射未復制),寫入后物理頁面地址與父進程不同(寫入時觸發(fā)頁面復制)?;赗ISC-V代理內核的操作系統(tǒng)課程實驗與課程設計第六章.實驗4:文件系統(tǒng)目錄實驗4的基礎知識PKE文件系統(tǒng)架構文件系統(tǒng)提供的接口虛擬文件系統(tǒng)VFSRFS文件系統(tǒng)實驗內容lab4_1文件操作lab4_2目錄文件lab4_3硬鏈接實驗4的基礎知識PKElab4的設計目標:為PKE添加文件系統(tǒng)支持PKE的文件系統(tǒng)應該:1.為進程提供合適的接口;2.支持VFS,以同時實現(xiàn)對hostfs文件和定制文件系統(tǒng)的訪

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論