計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)-基于RISC-V代理內(nèi)核 課件全套 邵志遠(yuǎn) 第1-6章 RISC-V體系結(jié)構(gòu) -實(shí)驗(yàn)4:文件系統(tǒng)_第1頁(yè)
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)-基于RISC-V代理內(nèi)核 課件全套 邵志遠(yuǎn) 第1-6章 RISC-V體系結(jié)構(gòu) -實(shí)驗(yàn)4:文件系統(tǒng)_第2頁(yè)
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)-基于RISC-V代理內(nèi)核 課件全套 邵志遠(yuǎn) 第1-6章 RISC-V體系結(jié)構(gòu) -實(shí)驗(yàn)4:文件系統(tǒng)_第3頁(yè)
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)-基于RISC-V代理內(nèi)核 課件全套 邵志遠(yuǎn) 第1-6章 RISC-V體系結(jié)構(gòu) -實(shí)驗(yàn)4:文件系統(tǒng)_第4頁(yè)
計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)指導(dǎo)-基于RISC-V代理內(nèi)核 課件全套 邵志遠(yuǎn) 第1-6章 RISC-V體系結(jié)構(gòu) -實(shí)驗(yàn)4:文件系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩110頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

RV64G機(jī)器的匯編語(yǔ)言

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

寫內(nèi)存(store):例如swrs2,offset(rs1)注:RISC-V采用小端字節(jié)序。如將0x1234ABCD寫入0x800地址后,各個(gè)地址的數(shù)據(jù)如下:[0x00000800]=0xCD;[0x00000801]=0xAB[0x00000802]=0x34;[0x00000803]=0x12C語(yǔ)言內(nèi)嵌匯編基本內(nèi)聯(lián)匯編語(yǔ)句: asm(“statements”);擴(kuò)展內(nèi)聯(lián)匯編:asmvolatile("statements"(匯編語(yǔ)句模板):output_regs(輸出部分):input_regs(輸入部分):clobbered_regs(破壞描述部分));內(nèi)嵌匯編實(shí)例:intdest=0;intvalue=1;asmvolatile("lwt0,%1\n\t""addt0,t0,t0\n\t""sdt0,%0":"=m"(dest)//輸出部分:"m"(value)//輸入部分:"memory"http://破壞描述部分);機(jī)器的特權(quán)狀態(tài)三種特權(quán)狀態(tài)的切換Machine模式下的CSR寄存器作用mscratchMachineScratch。保存機(jī)器模式的棧頂指針,這一點(diǎn)在離開機(jī)器模式進(jìn)入低特權(quán)級(jí)模式(如監(jiān)管模式)時(shí)非常重要,因?yàn)橐坏┰诘吞貦?quán)級(jí)模式發(fā)生異常,將可能會(huì)回到機(jī)器模式處理,這時(shí)機(jī)器模式需要有自己的棧來(lái)保存M模式下的執(zhí)行所調(diào)用的函數(shù)參數(shù)和返回地址。mstatusMachineStatus。保存機(jī)器狀態(tài)的寄存器。mtvecMachineTrapVector。指向中斷處理函數(shù)的入口地址。mepcMachineExceptionPC。指向發(fā)生異常的那條指令的地址。mcauseMachineCause。發(fā)生中斷的原因,如果發(fā)生的中斷是異常,其最高位為0,低位為異常編號(hào);如果發(fā)生的是其他類型的中斷,則其最高位為1,低位為中斷編號(hào)。mtvalMachineTrapValue。異常發(fā)生時(shí),附帶的參數(shù)值。例如,當(dāng)缺頁(yè)異常發(fā)生時(shí),mtval的值就是程序想要訪問的虛地址。mieMachineInterruptEnable。中斷開啟寄存器。mipMachineInterruptPending。中斷等待寄存器。midelegMachineInterruptDelegationRegisters。中斷代理寄存器。medelegMachineExceptionDelegationRegisters。異常代理寄存器。Machine模式下的mstatusMIE,SIE,UIE:中斷使能位。MPIE,SPIE,UPIE:中斷使能保存位。SPP,MPP:發(fā)生中斷異常之前的機(jī)器模式。MPRV,MXR,SUM:訪存控制相關(guān)位。mstatus寄存器Supervisor模式下的CSR寄存器作用sscratchSupervisorScratch。保存監(jiān)管模式的棧頂指針,這一點(diǎn)在離開機(jī)器模式進(jìn)入低特權(quán)級(jí)模式(如用戶模式)時(shí)非常重要,因?yàn)橐坏┰诘吞貦?quán)級(jí)模式發(fā)生異常,將可能會(huì)回到監(jiān)管模式處理(假設(shè)已通過異常授權(quán)),這時(shí)監(jiān)管模式需要用自己的棧保存程序執(zhí)行的返回地址等。sstatusSupervisorStatus。保存監(jiān)管狀態(tài)的寄存器。stvecSupervisorTrapVector。指向監(jiān)管模式中斷處理函數(shù)的入口地址。sepcSupervisorExceptionPC。指向發(fā)生異常的那條指令的地址。scauseSupervisorCause。發(fā)生中斷的原因,如果發(fā)生的中斷是異常,其最高位為0,低位為異常編號(hào);如果發(fā)生的是其他中斷其最高位為1,低位為中斷編號(hào)。stvalSupervisorTrapValue。異常發(fā)生時(shí),附帶的參數(shù)值。例如,當(dāng)缺頁(yè)異常發(fā)生時(shí),mtval的值就是程序想要訪問的虛地址。sieSupervisorInterruptEnable。中斷開啟寄存器。sipSupervisorInterruptPending。中斷等待寄存器。sidelegSupervisorInterruptDelegationRegisters。中斷代理寄存器。sedelegSupervisorExceptionDelegationRegisters。異常代理寄存器。Supervisor模式下的sstatussstatus與前面講述的mstatus結(jié)構(gòu)相似。sstatus中與mstatus相同位置的字段具有與mstatus有類似的作用。sstatus寄存器mstatus寄存器CSR寄存器的讀寫指令對(duì)CSR的讀寫操作僅可使用CSR讀寫指令,常用的CSR讀寫指令有:指令功能csrrrd,csrControlandStatusRegisterRead,讀CSR指令。把csr寄存器中的值寫入到rd寄存器中。csrwcsr,rs1ControlandStatusRegisterWrite,寫CSR指令。把rs1的值寫到csr寄存器中。csrscsr,rs1ControlandStatusRegisterSet,設(shè)置CSR指令。對(duì)于rs1中每一個(gè)為1的位,將csr寄存器中對(duì)應(yīng)位置位。csrccsr,rs1ControlandStatusRegisterClear,清除CSR指令。對(duì)于rs1中每一個(gè)為1的位,將csr寄存器中對(duì)應(yīng)位清零。csrrsrd,csr,rs1ControlandStatusRegisterReadandSet,讀后置位CSR指令。記控制寄存器中的值為t,把t和寄存器rs1按位或的結(jié)果寫入csr寄存器,再把t寫入rd寄存器。csrrcrd,csr,rs1ControlandStatusRegisterReadandClear,讀后清除CSR指令。記控制寄存器中的值為t,把t和寄存器rs1中的值按位與的結(jié)果寫入csr寄存器,再把t寫入rd寄存器。csrrwrd,csr,rs1ControlandStatusRegisterReadandWrite,讀后寫CSR指令。記控制寄存器中的值為t,把寄存器rs1的值寫入csr寄存器,再把t寫入rd寄存器。

中斷和中斷處理

中斷分為以下三類:Exception(異常)。Trap(即我們通常理解的“系統(tǒng)調(diào)用”或者“軟件中斷”)。

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

也稱VMM):Bare:物理內(nèi)存地址等于虛擬內(nèi)存地址;Sv39:支持39位邏輯地址;Sv48:Sv39的簡(jiǎn)單擴(kuò)展。Sv39中的物理地址與邏輯地址Sv39中邏輯地址的結(jié)構(gòu)Sv39中PDE/PTE格式

Sv39中虛擬地址到物理地址的轉(zhuǎn)換過程

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

代理內(nèi)核

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

代理內(nèi)核

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

基于RISC-V代理內(nèi)核的操作系統(tǒng)課程實(shí)驗(yàn)與課程設(shè)計(jì)

目錄

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

2.1實(shí)驗(yàn)環(huán)境安裝

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

目錄

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

實(shí)驗(yàn)代碼的獲取

對(duì)于頭歌平臺(tái)而言,無(wú)需自己獲取代碼。對(duì)于其他方式(自安裝系統(tǒng))需要使用git命令從gitee上獲取代碼。命令:$gitclone/hustos/riscv-pke.git

目錄

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

2.3PKE實(shí)驗(yàn)的組成

PKE實(shí)驗(yàn)由3組基礎(chǔ)實(shí)驗(yàn)以及基礎(chǔ)試驗(yàn)后的挑戰(zhàn)實(shí)驗(yàn)組成:基礎(chǔ)實(shí)驗(yàn):第一組基礎(chǔ)實(shí)驗(yàn)重點(diǎn)涉及系統(tǒng)調(diào)用、異常和外部中斷的知識(shí);第二組基礎(chǔ)實(shí)驗(yàn)重點(diǎn)涉及主存管理方面的知識(shí);第三組基礎(chǔ)實(shí)驗(yàn)重點(diǎn)涉及進(jìn)程管理方面的知識(shí)。挑戰(zhàn)實(shí)驗(yàn):每一組實(shí)驗(yàn)的挑戰(zhàn)實(shí)驗(yàn)都可以理解為在該組實(shí)驗(yàn)上的挑戰(zhàn)性內(nèi)容。

PKE實(shí)驗(yàn)的組成

PKE實(shí)驗(yàn)的組織結(jié)構(gòu)《操作系統(tǒng)》實(shí)驗(yàn)和課程設(shè)計(jì)安排課內(nèi)實(shí)驗(yàn)(16學(xué)時(shí))基礎(chǔ)內(nèi)容:PKE基礎(chǔ)實(shí)驗(yàn)(lab1_1~lab3_3)挑戰(zhàn)實(shí)驗(yàn):lab1_challenge1、lab2_challenge1、lab3_challenge1課程設(shè)計(jì)(2周)挑戰(zhàn)實(shí)驗(yàn):

lab1_challenge2、lab2_challenge2、lab3_challenge2《系統(tǒng)能力培養(yǎng)——藍(lán)牙小車》實(shí)驗(yàn)安排藍(lán)牙小車實(shí)驗(yàn)1:硬件、軟件系統(tǒng)集成實(shí)驗(yàn)2:藍(lán)牙小車應(yīng)用擴(kuò)展軟件部分(/hustos/pke-doc)實(shí)驗(yàn)1~3:基礎(chǔ)部分實(shí)驗(yàn)4_1:polling模式外設(shè)管理實(shí)驗(yàn)4_2:PLIC模式中斷處理實(shí)驗(yàn)4_3:PS端設(shè)備硬件部分(RISCV-on-PYNQ)實(shí)驗(yàn)1:RISCV-on-PYNQ的部署實(shí)驗(yàn)2:AXI-UART橋接實(shí)驗(yàn)3:PLIC控制器設(shè)計(jì)基于RISC-V代理內(nèi)核的操作系統(tǒng)課程實(shí)驗(yàn)與課程設(shè)計(jì)第三章.實(shí)驗(yàn)1:系統(tǒng)調(diào)用、異常和外部中斷

目錄

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

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

目錄

實(shí)驗(yàn)1的基礎(chǔ)知識(shí)RISC-V程序的編譯和鏈接指定符號(hào)的邏輯地址代理內(nèi)核的構(gòu)造過程代理內(nèi)核的啟動(dòng)過程ELF文件(app)的加載過程spike的HTIF接口實(shí)驗(yàn)內(nèi)容lab1_1系統(tǒng)調(diào)用lab1_2異常處理lab1_3(外部)中斷l(xiāng)ab1_1系統(tǒng)調(diào)用給定應(yīng)用預(yù)期輸出lab1_1系統(tǒng)調(diào)用實(shí)驗(yàn)內(nèi)容:給定應(yīng)用沒有實(shí)現(xiàn)預(yù)期效果,即在屏幕上打印“Helloworld!\n”。實(shí)驗(yàn)代碼中syscall沒有被調(diào)用,找到并完成對(duì)do_syscall的調(diào)用,獲得預(yù)期的輸出結(jié)果。需要通過調(diào)用handle_illegal_instruction函數(shù)完成異常指令處理,阻止app_illegal_instruction的執(zhí)行。lab1_2異常處理給定應(yīng)用預(yù)期輸出lab1_2異常處理實(shí)驗(yàn)內(nèi)容:(在用戶U模式下執(zhí)行的)應(yīng)用企圖執(zhí)行RISC-V的特權(quán)指令csrwsscratch,0。該指令會(huì)修改S模式的棧指針,如果允許該指令的執(zhí)行,執(zhí)行的結(jié)果可能會(huì)導(dǎo)致系統(tǒng)崩潰。通過調(diào)用handle_illegal_instruction函數(shù)完成異常指令處理,阻止app_illegal_instruction的執(zhí)行。lab1_3(外部)中斷給定應(yīng)用預(yù)期輸出lab1_3(外部)中斷實(shí)驗(yàn)內(nèi)容:給定的程序在運(yùn)行過程中受到了系統(tǒng)的外部時(shí)鐘中斷(timerirq)的“干擾”。而我們?cè)谶@個(gè)實(shí)驗(yàn)中給出的PKE操作系統(tǒng)內(nèi)核,在時(shí)鐘中斷部分并未完全做好,導(dǎo)致(模擬)RISC-V機(jī)器碰到第一個(gè)時(shí)鐘中斷后就會(huì)出現(xiàn)崩潰。完成PKE操作系統(tǒng)內(nèi)核未完成的時(shí)鐘中斷處理過程,使得它能夠完整地處理時(shí)鐘中斷?;赗ISC-V代理內(nèi)核的操作系統(tǒng)課程實(shí)驗(yàn)與課程設(shè)計(jì)第四章.實(shí)驗(yàn)2:內(nèi)存管理目錄實(shí)驗(yàn)2的基礎(chǔ)知識(shí)Sv39虛地址管理方案回顧物理內(nèi)存布局與規(guī)劃PKE操作系統(tǒng)和應(yīng)用進(jìn)程的邏輯地址空間結(jié)構(gòu)與頁(yè)表操作相關(guān)的重要函數(shù)實(shí)驗(yàn)內(nèi)容lab2_1虛實(shí)地址轉(zhuǎn)換lab2_2簡(jiǎn)單內(nèi)存分配和回收l(shuí)ab2_3缺頁(yè)異常實(shí)驗(yàn)2的基礎(chǔ)知識(shí)Sv39虛地址管理方案回顧Sv39中邏輯地址的結(jié)構(gòu)Sv39中PDE/PTE格式Sv39虛地址管理方案回顧Sv39中虛擬地址到物理地址的轉(zhuǎn)換過程Sv39虛地址管理方案回顧satp寄存器格式satp寄存器中MODE域的取值和含義取值虛存方案0Bare8Sv399Sv48物理內(nèi)存布局與規(guī)劃對(duì)于我們用spike的模擬RISC-V機(jī)器而言,2GB的物理內(nèi)存并不是從0地址開始編址,而是從0x80000000開始編址的。PKE操作系統(tǒng)的邏輯地址空間結(jié)構(gòu)在開啟了Sv39虛擬內(nèi)存管理方案后,所有的邏輯地址到物理地址的翻譯都必須通過頁(yè)表和MMU硬件進(jìn)行。PKE操作系統(tǒng)內(nèi)核的邏輯地址空間和它到物理地址空間的映射圖PKE應(yīng)用進(jìn)程的邏輯地址空間結(jié)構(gòu)lab2_1的應(yīng)用app_helloworld_no_lds進(jìn)程在裝入后,其邏輯地址空間有4個(gè)區(qū)間建立了和物理地址空間的映射。用戶進(jìn)程的邏輯地址空間到物理地址空間的映射圖與頁(yè)表操作相關(guān)的重要函數(shù)1、將邏輯地址映射到物理地址intmap_pages(pagetable_tpage_dir,uint64va,uint64size,uint64pa,intperm);2、查找邏輯地址所在的頁(yè)表項(xiàng)pte_t*page_walk(pagetable_tpage_dir,uint64va,intalloc);3、查找邏輯地址所在虛擬頁(yè)面地址對(duì)應(yīng)的物理頁(yè)面地址uint64lookup_pa(pagetable_tpagetable,uint64va);目錄實(shí)驗(yàn)2的基礎(chǔ)知識(shí)Sv39虛地址管理方案回顧物理內(nèi)存布局與規(guī)劃PKE操作系統(tǒng)和應(yīng)用進(jìn)程的邏輯地址空間結(jié)構(gòu)與頁(yè)表操作相關(guān)的重要函數(shù)實(shí)驗(yàn)內(nèi)容lab2_1虛實(shí)地址轉(zhuǎn)換lab2_2簡(jiǎn)單內(nèi)存分配和回收l(shuí)ab2_3缺頁(yè)異常lab2_1虛實(shí)地址轉(zhuǎn)換給定應(yīng)用預(yù)期輸出lab2_1虛實(shí)地址轉(zhuǎn)換實(shí)驗(yàn)內(nèi)容:開啟Sv39頁(yè)式地址管理,將應(yīng)用(app_helloworld_no_lds.c,鏈接時(shí)未指定邏輯地址)投入正常運(yùn)行。實(shí)現(xiàn)user_va_to_pa()函數(shù),完成給定邏輯地址到物理地址的轉(zhuǎn)換,最終使得helloworld程序獲得正確輸出。lab2_2簡(jiǎn)單內(nèi)存分配和回收給定應(yīng)用預(yù)期輸出lab2_2簡(jiǎn)單內(nèi)存分配和回收實(shí)驗(yàn)內(nèi)容:這里,新定義了兩個(gè)用戶態(tài)函數(shù)naive_malloc()和naive_free(),它們最終會(huì)轉(zhuǎn)換成系統(tǒng)調(diào)用,完成內(nèi)存的分配和回收操作。需要完成naive_free對(duì)應(yīng)的功能,獲得預(yù)期的輸出。lab2_3缺頁(yè)異常給定應(yīng)用預(yù)期輸出lab2_3缺頁(yè)異常實(shí)驗(yàn)內(nèi)容:應(yīng)用程序執(zhí)行時(shí),由于采用遞歸函數(shù)求等差數(shù)列的和,遞歸層數(shù)過多,使得用戶態(tài)棧溢出。本實(shí)驗(yàn)中,我們處理的是缺頁(yè)異常。首先,判斷我們處理的確實(shí)是缺頁(yè)異常;判斷發(fā)生缺頁(yè)的是不是用戶??臻g,如果是則分配一個(gè)物理頁(yè)空間,最后將該空間通過vm_map“粘”到用戶棧上以擴(kuò)充用戶??臻g?;赗ISC-V代理內(nèi)核的操作系統(tǒng)課程實(shí)驗(yàn)與課程設(shè)計(jì)第五章.實(shí)驗(yàn)3:進(jìn)程管理目錄實(shí)驗(yàn)3的基礎(chǔ)知識(shí)多任務(wù)環(huán)境下進(jìn)程的封裝進(jìn)程的換入與換出就緒進(jìn)程的管理與調(diào)度實(shí)驗(yàn)內(nèi)容lab3_1進(jìn)程創(chuàng)建(fork)lab3_2進(jìn)程yieldlab3_3循環(huán)輪轉(zhuǎn)調(diào)度實(shí)驗(yàn)3的基礎(chǔ)知識(shí)多任務(wù)環(huán)境下進(jìn)程的封裝實(shí)驗(yàn)三的PKE操作系統(tǒng)將需要支持多個(gè)進(jìn)程的執(zhí)行。操作系統(tǒng)定義了進(jìn)程池(processprocs[NPROC];)。并對(duì)進(jìn)程的結(jié)構(gòu)進(jìn)行了擴(kuò)充,加入以下成員:mapped_info;//pointstoapagethatcontainsmapped_regionstotal_mapped_region;

//nextfreemappedregioninmapped_infouint64pid;//processid,intstatus;//processstatus,structprocess*parent;//parentprocess,structprocess*queue_next;//nextqueueelement;多任務(wù)環(huán)境下進(jìn)程的封裝進(jìn)程可能擁有的段分為以下幾個(gè)類型:enumsegment_type{CODE_SEGMENT,//ELFsegmentDATA_SEGMENT,//ELFsegmentSTACK_SEGMENT,//runtimesegmentCONTEXT_SEGMENT,//trapframesegmentSYSTEM_SEGMENT,//systemsegment};進(jìn)程具有以下幾種狀態(tài):enumproc_status{FREE,//unusedstateREADY,//readystateRUNNING,//currentlyrunningBLOCKED,//waitingforsomethingZOMBIE,//terminatedbutnotreclaimedyet};進(jìn)程的啟動(dòng)進(jìn)程啟動(dòng)的步驟:一、調(diào)用alloc_process()函數(shù):找到一個(gè)空的進(jìn)程結(jié)構(gòu)體為新創(chuàng)建的進(jìn)程建立了KERN_BASE以上邏輯地址的映射將映射信息保存到進(jìn)程結(jié)構(gòu)中二、調(diào)用load_bincode_from_host_elf()函數(shù)載入給定應(yīng)用對(duì)應(yīng)的ELF文件的各個(gè)段三、調(diào)用的elf_load()函數(shù)在載入段后,將對(duì)被載入的段進(jìn)行判斷,以記錄它們的虛地址映射,此時(shí)將形成用戶進(jìn)程的虛地址空間結(jié)構(gòu)。四、通過switch_to()函數(shù)將所構(gòu)造的進(jìn)程投入執(zhí)行;進(jìn)程的終止進(jìn)程的終止通過exit系統(tǒng)調(diào)用實(shí)現(xiàn):一、調(diào)用free_process(current):將進(jìn)程設(shè)為ZOMBIE狀態(tài),而不會(huì)將進(jìn)程所占用的資源全部釋放。該函數(shù)被調(diào)用時(shí)操作系統(tǒng)是在S模式下運(yùn)行,而按照PKE的設(shè)計(jì)思想,S態(tài)的運(yùn)行將使用當(dāng)前進(jìn)程的用戶系統(tǒng)棧。此時(shí),如果將當(dāng)前進(jìn)程的內(nèi)存空間進(jìn)行釋放,將導(dǎo)致操作系統(tǒng)本身的崩潰。二、調(diào)用schedule()函數(shù):選擇系統(tǒng)中可能存在的其他處于就緒狀態(tài)的進(jìn)程投入運(yùn)行。就緒進(jìn)程的管理與調(diào)度PKE的操作系統(tǒng)設(shè)計(jì)了一個(gè)非常簡(jiǎn)單的就緒隊(duì)列管理。將一個(gè)進(jìn)程加入就緒隊(duì)列,可以調(diào)用insert_to_ready_queue()函數(shù):若就緒隊(duì)列為空,將本進(jìn)程作為就緒隊(duì)列頭。若就緒隊(duì)列非空,則將本進(jìn)程加入就緒隊(duì)尾。PKE內(nèi)核通過調(diào)用schedule()函數(shù)來(lái)完成進(jìn)程的選擇和換入:若就緒隊(duì)列空,檢查是否存在未結(jié)束的進(jìn)程。如果有,等待期執(zhí)行結(jié)束;如果無(wú),則啟動(dòng)關(guān)機(jī)程序。若就緒隊(duì)列非空,將就緒隊(duì)列隊(duì)首的進(jìn)程換入執(zhí)行。目錄實(shí)驗(yàn)3的基礎(chǔ)知識(shí)多任務(wù)環(huán)境下進(jìn)程的封裝進(jìn)程的換入與換出就緒進(jìn)程的管理與調(diào)度實(shí)驗(yàn)內(nèi)容lab3_1進(jìn)程創(chuàng)建(fork)lab3_2進(jìn)程yieldlab3_3循環(huán)輪轉(zhuǎn)調(diào)度lab3_1進(jìn)程創(chuàng)建(fork)給定應(yīng)用預(yù)期輸出lab3_1進(jìn)程創(chuàng)建(fork)實(shí)驗(yàn)內(nèi)容:主進(jìn)程調(diào)用fork()函數(shù)試圖創(chuàng)建一個(gè)子進(jìn)程,但是應(yīng)用程序的fork動(dòng)作并未將子進(jìn)程給創(chuàng)建出來(lái)并投入運(yùn)行。修改kernel/process.c文件中的do_fork()函數(shù)。對(duì)于父進(jìn)程的代碼段,通過映射的辦法,將子進(jìn)程中對(duì)應(yīng)的邏輯地址空間映射到其父進(jìn)程中裝載代碼段的物理頁(yè)面。lab3_2進(jìn)程yield給定應(yīng)用預(yù)期輸出lab3_2進(jìn)程yield實(shí)驗(yàn)內(nèi)容:yield()函數(shù)功能未完善導(dǎo)致使得進(jìn)程無(wú)法讓出執(zhí)行權(quán)。完善yield()函數(shù)實(shí)現(xiàn)進(jìn)程執(zhí)行過程中的主動(dòng)釋放CPU的動(dòng)作:將當(dāng)前進(jìn)程置為就緒狀態(tài)(READY);將當(dāng)前進(jìn)程加入到就緒隊(duì)列的隊(duì)尾;轉(zhuǎn)進(jìn)程調(diào)度。lab3_3循環(huán)輪轉(zhuǎn)調(diào)度給定應(yīng)用預(yù)期輸出lab3_3循環(huán)輪轉(zhuǎn)調(diào)度實(shí)驗(yàn)內(nèi)容:兩個(gè)進(jìn)程在執(zhí)行各自循環(huán)體時(shí),都沒有主動(dòng)釋放CPU的動(dòng)作。這樣的設(shè)計(jì)會(huì)導(dǎo)致某個(gè)進(jìn)程長(zhǎng)期占據(jù)CPU,而另一個(gè)進(jìn)程無(wú)法得到執(zhí)行。通過利用時(shí)鐘中斷來(lái)實(shí)現(xiàn)進(jìn)程的循環(huán)輪轉(zhuǎn)調(diào)度,避免由于一個(gè)進(jìn)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論