孫衛(wèi)真,劉雪松,朱威浦,向 勇
(1.首都師范大學(xué) 信息工程學(xué)院,北京 100048;2.中國(guó)科學(xué)院 計(jì)算技術(shù)研究所,北京 101407;3.清華大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)系,北京 100084)
目前,高校進(jìn)行計(jì)算機(jī)系統(tǒng)教學(xué)實(shí)驗(yàn)主要有以下幾種教學(xué)方式:其一是使用純硬件搭建實(shí)驗(yàn)平臺(tái),雖該方式可深入接觸計(jì)算機(jī)硬件模塊,但實(shí)驗(yàn)操作機(jī)械死板、硬件平臺(tái)開(kāi)發(fā)成本較高;其二是采用軟件系統(tǒng)仿真的方式,該方法成本較低、易于上手,但受教育者不能在實(shí)驗(yàn)過(guò)程中較好體會(huì)到計(jì)算機(jī)與硬件的緊密結(jié)合[1]。
為了優(yōu)化上述問(wèn)題,實(shí)現(xiàn)設(shè)計(jì)目標(biāo),本文從硬件支持、處理器構(gòu)建、系統(tǒng)編程語(yǔ)言選擇三方面考慮,構(gòu)建計(jì)算機(jī)系統(tǒng)實(shí)驗(yàn)平臺(tái)。首先,F(xiàn)PGA開(kāi)發(fā)板能為學(xué)生提供軟硬件協(xié)作的基本實(shí)驗(yàn)環(huán)境,并能結(jié)合特定的實(shí)驗(yàn)設(shè)計(jì)達(dá)到幫助學(xué)生建立計(jì)算機(jī)系統(tǒng)思維的目標(biāo)[2-5],因此將其作為本研究的硬件模塊平臺(tái)。其次,RISC-V因具有完全開(kāi)源、架構(gòu)簡(jiǎn)單、易于移植、模塊化設(shè)計(jì)等優(yōu)勢(shì)被研究人員用來(lái)構(gòu)建新的片上處理器[6,7]。最后,Rust語(yǔ)言作為新興系統(tǒng)編程語(yǔ)言致力于解決高并發(fā)和高安全性系統(tǒng)問(wèn)題[8],目前已有許多開(kāi)源社區(qū)的開(kāi)發(fā)人員基于Rust語(yǔ)言對(duì)操作系統(tǒng)的開(kāi)發(fā)進(jìn)行了嘗試。清華大學(xué)教學(xué)操作系統(tǒng)rCore[9]的實(shí)現(xiàn)就具有很好的代表性。
為緊跟技術(shù)發(fā)展并及時(shí)更新實(shí)驗(yàn)內(nèi)容,本研究以基于RISC-V CPU的組成原理實(shí)驗(yàn)、基于Rust語(yǔ)言的教學(xué)操作系統(tǒng)實(shí)驗(yàn)作為本文的實(shí)現(xiàn)案例,幫助學(xué)生深入理解計(jì)算機(jī)系統(tǒng)組成、完善知識(shí)結(jié)構(gòu),在資源與成本受限的情況下,設(shè)計(jì)滿(mǎn)足高校需求的軟硬件結(jié)合的計(jì)算機(jī)系統(tǒng)綜合實(shí)驗(yàn)平臺(tái)。
基于RISC-V的計(jì)算機(jī)系統(tǒng)綜合實(shí)驗(yàn)主要包含兩部分內(nèi)容,其一是在FPGA開(kāi)發(fā)板上搭建硬件系統(tǒng)實(shí)驗(yàn)平臺(tái)以完成計(jì)算機(jī)組成原理實(shí)驗(yàn),其二是在自己搭建的硬件平臺(tái)上移植基于Rust語(yǔ)言的rCore教學(xué)操作系統(tǒng)并完成操作系統(tǒng)的各個(gè)功能模塊實(shí)驗(yàn)。綜合實(shí)驗(yàn)各模塊組成關(guān)系如圖1所示。
圖1 綜合實(shí)驗(yàn)?zāi)K
如圖1所示在計(jì)算機(jī)系統(tǒng)實(shí)驗(yàn)平臺(tái)中實(shí)線框表示硬件模塊、虛線框表示引導(dǎo)模塊、點(diǎn)線表示內(nèi)核模塊、長(zhǎng)短相間虛線表示用戶(hù)程序模塊,各個(gè)模塊按圖示方式組合構(gòu)成教學(xué)實(shí)驗(yàn)平臺(tái)。
硬件模塊的參考實(shí)現(xiàn)首先在Quartus中實(shí)現(xiàn)基于RISC-V的picorv32 CPU[10]封裝,其次添加相關(guān)外設(shè)并完成總線互連,在完成硬件平臺(tái)搭建后,將其燒錄至低成本的FPGA開(kāi)發(fā)板STEP-CYC10中。學(xué)生可根據(jù)計(jì)算機(jī)組成原理實(shí)驗(yàn)的參考實(shí)現(xiàn)替換CPU或其它外設(shè)模塊。為檢測(cè)硬件平臺(tái)搭建的正確性,實(shí)驗(yàn)將通過(guò)RISC-V標(biāo)準(zhǔn)指令集測(cè)試對(duì)硬件平臺(tái)進(jìn)行測(cè)試,最終完成組成原理實(shí)驗(yàn)的參考實(shí)現(xiàn)。
軟件模塊的參考實(shí)現(xiàn)首先設(shè)計(jì)與硬件系統(tǒng)模塊相匹配的引導(dǎo)程序,其次移植基于Rust語(yǔ)言的rCore教學(xué)操作系統(tǒng)。為保證能夠在STEP-CYC10有限的存儲(chǔ)資源下完成更豐富的軟件功能,實(shí)驗(yàn)設(shè)計(jì)通過(guò)對(duì)rCore內(nèi)核與用戶(hù)程序進(jìn)行壓縮處理得到內(nèi)核壓縮鏡像后作為數(shù)據(jù)初始化硬件平臺(tái)ROM存儲(chǔ)模塊。引導(dǎo)程序、解壓縮模塊、加載模塊將作為實(shí)驗(yàn)支持提供給學(xué)生,學(xué)生需在操作系統(tǒng)參考實(shí)現(xiàn)框架下完成最小化內(nèi)核、系統(tǒng)調(diào)用、中斷服務(wù)程序與設(shè)備驅(qū)動(dòng)等實(shí)驗(yàn)。
通過(guò)上述硬件實(shí)驗(yàn)與軟件實(shí)驗(yàn)兩個(gè)層面的結(jié)合,本文完成了計(jì)算機(jī)系統(tǒng)教學(xué)實(shí)驗(yàn)平臺(tái)的搭建與實(shí)驗(yàn)案例的展現(xiàn),達(dá)到了在低成本前提下設(shè)計(jì)基于RISC-V CPU與Rust操作系統(tǒng)教學(xué)實(shí)驗(yàn)內(nèi)容的目的。
計(jì)算機(jī)組成原理是計(jì)算機(jī)學(xué)科的專(zhuān)業(yè)核心課程,該課程的教學(xué)目的是使學(xué)生理解計(jì)算機(jī)各個(gè)部件的工作原理、建立計(jì)算機(jī)的整體概念。計(jì)算機(jī)組成原理主要學(xué)習(xí)包括控制器、運(yùn)算器、存儲(chǔ)器、輸入輸出設(shè)備等模塊的設(shè)計(jì)方法、各子系統(tǒng)之間的相互關(guān)系以及相互連接構(gòu)成整機(jī)系統(tǒng)的方法。
目前,各高校普遍缺乏與計(jì)算機(jī)組成原理實(shí)驗(yàn)課程相配套的實(shí)驗(yàn)教學(xué)平臺(tái),或者存在教學(xué)平臺(tái)可用性不強(qiáng)、成本過(guò)高等問(wèn)題。針對(duì)以上問(wèn)題,在滿(mǎn)足組成原理實(shí)驗(yàn)基本需求的前提下,實(shí)驗(yàn)通過(guò)提供簡(jiǎn)易的FPGA開(kāi)發(fā)板作為硬件平臺(tái),讓學(xué)生使用Verilog設(shè)計(jì)CPU,實(shí)現(xiàn)運(yùn)算器和控制器等主要部件。通過(guò)統(tǒng)一的外部總線接口,CPU能夠與預(yù)設(shè)的各個(gè)外部設(shè)備控制器連接形成片上系統(tǒng),然后燒錄至FPGA中形成計(jì)算機(jī)硬件系統(tǒng)。
硬件實(shí)驗(yàn)在STEP-CYC10開(kāi)發(fā)板上搭建基于RISC-V CPU 的SoC系統(tǒng),可以使用片上ROM、SDRAM、LED,數(shù)碼管等外部設(shè)備。實(shí)驗(yàn)將硬件系統(tǒng)中連同CPU在內(nèi)的各個(gè)部分模塊化。學(xué)生在遵循統(tǒng)一的總線接口協(xié)議設(shè)計(jì)CPU和外設(shè)控制模塊后,可以將各模塊進(jìn)行互連以完成SoC系統(tǒng)的搭建。模塊化的實(shí)驗(yàn)平臺(tái)為學(xué)生進(jìn)行計(jì)算機(jī)組成原理實(shí)驗(yàn)提供了多種選擇,學(xué)生可根據(jù)實(shí)驗(yàn)需求替換、增加實(shí)驗(yàn)?zāi)K。
2.1.1 STEP-CYC10開(kāi)發(fā)板
目前,市面上通用的FPGA開(kāi)發(fā)板種類(lèi)十分豐富,出于對(duì)成本的考慮,本研究采用國(guó)產(chǎn)小腳丫STEP-CYC10開(kāi)發(fā)板作為硬件平臺(tái)。小腳丫STEP-CYC10開(kāi)發(fā)板的FPGA芯片有16 000基本邏輯單元,板卡上集成了USB Blaster編程器、SDRAM、FLASH等多種外設(shè),基本可以滿(mǎn)足課程實(shí)驗(yàn)的需求。
2.1.2 Quartus軟件
STEP-CYC10開(kāi)發(fā)板上集成的FPGA為Altera系列芯片,因此實(shí)驗(yàn)可直接使用其相應(yīng)配套的Quartus作為系統(tǒng)搭建環(huán)境和燒錄工具。此外,Quartus中的Platform Designer還為遵循Avolon總線協(xié)議、AXI總線協(xié)議的IP核提供GUI界面的互連功能。
將組成原理硬件實(shí)驗(yàn)平臺(tái)搭建完成,給出以picore32 CPU為核心的組成原理實(shí)驗(yàn)參考實(shí)現(xiàn)并敘述CPU外接各外設(shè)接口與模塊的實(shí)現(xiàn)。接下來(lái)分模塊對(duì)組成原理實(shí)驗(yàn)進(jìn)行詳細(xì)闡述。
2.2.1 硬件實(shí)驗(yàn)?zāi)K化
實(shí)驗(yàn)設(shè)計(jì)將計(jì)算機(jī)系統(tǒng)的基本部件分為三大模塊,即CPU、存儲(chǔ)器、外部設(shè)備。本實(shí)驗(yàn)將為學(xué)生提供一個(gè)完整的SoC系統(tǒng)作為參考,并讓學(xué)生分別完成3個(gè)基本模塊,然后逐步替換至預(yù)先提供的SoC系統(tǒng)之中,最終完成個(gè)人的SoC系統(tǒng)的設(shè)計(jì)。
為保證模塊之間互連的可行性,各個(gè)模塊之間的連接需要遵循統(tǒng)一的片上總線協(xié)議。對(duì)于實(shí)現(xiàn)Avolon、AXI總線接口的模塊,可通過(guò)Quartus對(duì)其進(jìn)行連接,在連接完成后由Quartus自行實(shí)現(xiàn)總線類(lèi)型轉(zhuǎn)換。在此實(shí)驗(yàn)設(shè)計(jì)中,總線轉(zhuǎn)接橋?qū)⒆鳛榻M成原理實(shí)驗(yàn)的支持模塊提供給學(xué)生,讓學(xué)生能夠?qū)?shí)驗(yàn)重心置于各模塊的設(shè)計(jì)與實(shí)現(xiàn)上。
2.2.2 CPU的設(shè)計(jì)與實(shí)現(xiàn)
CPU的工作原理是計(jì)算機(jī)組成原理課程內(nèi)容的核心,其設(shè)計(jì)與實(shí)現(xiàn)也是本實(shí)驗(yàn)的重中之重。通過(guò)對(duì)數(shù)據(jù)通路和控制通路的構(gòu)建,學(xué)生能夠掌握CPU工作的基本原理,深刻理解控制器和運(yùn)算器的運(yùn)行流程。本實(shí)驗(yàn)提供的CPU參考設(shè)計(jì)是以picorv32 CPU為核心構(gòu)造的AXI總線IP核。picorv32是開(kāi)源的RISC-V軟核,支持多種RISC-V指令集模塊,具有小體積、高頻率與低功率的特點(diǎn)。
在學(xué)生完成自己CPU的設(shè)計(jì)前,可使用picorv32軟核,通過(guò)Quartus系統(tǒng)集成工具Platform Designer將其封裝為AXI總線接口的IP核模塊以實(shí)現(xiàn)外部模塊的互連。
2.2.3 存儲(chǔ)器的設(shè)計(jì)與實(shí)現(xiàn)
存儲(chǔ)器是存儲(chǔ)程序的重要部件,也是計(jì)算機(jī)組成原理中必不可少的一部分。本參考實(shí)驗(yàn)采用片內(nèi)存儲(chǔ)與片外存儲(chǔ)相結(jié)合的方式形成硬件系統(tǒng)的存儲(chǔ)模塊。
片內(nèi)存儲(chǔ)模塊使用的存儲(chǔ)資源為FPGA內(nèi)部存儲(chǔ)部件,可使用Quartus提供的ROM IP核對(duì)該存儲(chǔ)資源進(jìn)行例化。為使系統(tǒng)正常運(yùn)行,需將上述轉(zhuǎn)換為Intel Hex格式的二進(jìn)制程序隨SoC系統(tǒng)綜合后再下板。
由于片內(nèi)存儲(chǔ)存儲(chǔ)容量的局限性,軟件系統(tǒng)的功能尤其在操作系統(tǒng)加載時(shí)會(huì)受到一定的影響,為此可在使用片上存儲(chǔ)的基礎(chǔ)上,添加片外存儲(chǔ)資源。STEP-CYC10開(kāi)發(fā)板上集成的SDRAM可提供大小為64 Mb的外部SDRAM存儲(chǔ)資源。SDRAM的啟用、初始化及基本讀寫(xiě)操作可通過(guò)Quartus提供的sdram controller IP核完成。
實(shí)驗(yàn)過(guò)程中,學(xué)生需要通過(guò)軟件開(kāi)發(fā)工具鏈將程序編譯轉(zhuǎn)換為對(duì)應(yīng)的格式用于初始化片內(nèi)ROM存儲(chǔ)資源,并理解CPU對(duì)于存儲(chǔ)設(shè)備的尋址方式和取數(shù)過(guò)程。
2.2.4 外部設(shè)備的設(shè)計(jì)與實(shí)現(xiàn)
外部設(shè)備是計(jì)算機(jī)系統(tǒng)中的重要組成部分,一般分為輸入設(shè)備、輸出設(shè)備和外部存儲(chǔ)設(shè)備,起數(shù)據(jù)傳輸、轉(zhuǎn)入和存儲(chǔ)的作用。STEP-CYC10開(kāi)發(fā)板上集成LED,數(shù)碼管、串口等外部設(shè)備。本實(shí)驗(yàn)設(shè)計(jì)為SoC系統(tǒng)添加GPIO和串口設(shè)備。在SoC上運(yùn)行的程序依賴(lài)于上位機(jī)可實(shí)現(xiàn)簡(jiǎn)易的用戶(hù)交互功能。各外部設(shè)備控制器采用Quartus提供的IP核實(shí)現(xiàn),如串口模塊使用RS-232 IP核、GPIO設(shè)備采用PIO IP核。通過(guò)本模塊的設(shè)計(jì),學(xué)生可以掌握外部設(shè)備與CPU交互的基本原理,外部設(shè)備控制器的工作流程。
2.2.5 硬件系統(tǒng)的連接
CPU、存儲(chǔ)器、外部設(shè)備3個(gè)模塊實(shí)現(xiàn)時(shí),若按照預(yù)先規(guī)定的總線接口,則可以直接在Quartus的Platform Designer中通過(guò)GUI連線方式將其連接成為SoC系統(tǒng),極大地簡(jiǎn)化系統(tǒng)連接的實(shí)現(xiàn)流程。在連接硬件系統(tǒng)的過(guò)程中,需要為系統(tǒng)的存儲(chǔ)設(shè)備和外部設(shè)備分配地址空間。本實(shí)驗(yàn)設(shè)計(jì)的SoC系統(tǒng)物理地址空間布局見(jiàn)表1。通過(guò)硬件系統(tǒng)連接實(shí)驗(yàn),學(xué)生可加深對(duì)系統(tǒng)地址空間概念和外部設(shè)備尋址方式的認(rèn)識(shí)。
表1 物理地址空間布局
在計(jì)算機(jī)組成原理參考實(shí)現(xiàn)中,封裝后的CPU與各個(gè)外設(shè)模塊IP核均通過(guò)Avalon總線轉(zhuǎn)換器進(jìn)行互連形成完整的組成原理硬件實(shí)驗(yàn)平臺(tái)。為排除運(yùn)行故障需要通過(guò)標(biāo)準(zhǔn)測(cè)試集測(cè)試以驗(yàn)證系統(tǒng)功能,此外也可通過(guò)添加LED與數(shù)碼管模塊檢測(cè)實(shí)驗(yàn)結(jié)果的正確性。
基于計(jì)算機(jī)組成原理實(shí)驗(yàn)的參考實(shí)現(xiàn),在現(xiàn)有開(kāi)發(fā)環(huán)境Quartus及其自帶編譯工具鏈的基礎(chǔ)上,學(xué)生可用自行設(shè)計(jì)的CPU模塊或其它模塊替換參考實(shí)現(xiàn)中的模塊。實(shí)驗(yàn)平臺(tái)可根據(jù)學(xué)生基礎(chǔ)提供從基本指令集到多種擴(kuò)展的不同難度的實(shí)驗(yàn)。
操作系統(tǒng)實(shí)驗(yàn)是操作系統(tǒng)原理課程的重要組成部分。通過(guò)操作系統(tǒng)實(shí)驗(yàn),學(xué)生可加深對(duì)操作系統(tǒng)運(yùn)行過(guò)程的理解。本操作系統(tǒng)實(shí)驗(yàn)要求學(xué)生在已完成的硬件SoC系統(tǒng)平臺(tái)基礎(chǔ)上設(shè)計(jì)和實(shí)現(xiàn)教學(xué)操作系統(tǒng)rCore核心功能、提供應(yīng)用程序的運(yùn)行環(huán)境。
本操作系統(tǒng)實(shí)驗(yàn)使用的實(shí)驗(yàn)環(huán)境為L(zhǎng)inux系統(tǒng)下的開(kāi)發(fā)工具鏈,包括RISC-V編譯工具鏈、Rust編譯工具鏈、qemu模擬器等。實(shí)驗(yàn)依據(jù)現(xiàn)有的RISC-V CPU設(shè)計(jì)實(shí)現(xiàn)小型教學(xué)操作系統(tǒng)rCore,并在qemu模擬器中完成核心功能的驗(yàn)證與調(diào)試,然后根據(jù)硬件系統(tǒng)適應(yīng)性地調(diào)整操作系統(tǒng)的功能,并移植到硬件平臺(tái)。在設(shè)計(jì)實(shí)現(xiàn)操作系統(tǒng)前,實(shí)驗(yàn)將提供RISC-V標(biāo)準(zhǔn)測(cè)試集對(duì)CPU硬件功能進(jìn)行測(cè)試,以減少運(yùn)行操作系統(tǒng)時(shí)硬件可能帶來(lái)的錯(cuò)誤。
操作系統(tǒng)實(shí)驗(yàn)設(shè)計(jì)分為3層,分別為引導(dǎo)程序、操作系統(tǒng)內(nèi)核、用戶(hù)程序的設(shè)計(jì)與實(shí)現(xiàn),通過(guò)上述3層結(jié)構(gòu)構(gòu)成完整的軟件系統(tǒng)。
參考實(shí)現(xiàn)各模塊關(guān)系如圖2所示,引導(dǎo)程序設(shè)計(jì)分為ROM與SDRAM兩段引導(dǎo),包括設(shè)備初始化、解壓縮、內(nèi)核與用戶(hù)程序加載等功能。操作系統(tǒng)內(nèi)核模塊實(shí)現(xiàn)中斷處理、系統(tǒng)調(diào)用、用戶(hù)程序解析等功能。用戶(hù)程序設(shè)計(jì)為如何讓操作系統(tǒng)加載解析ELF用戶(hù)程序,跳轉(zhuǎn)至用戶(hù)空間執(zhí)行用戶(hù)程序。通過(guò)操作系統(tǒng)實(shí)驗(yàn)的3層設(shè)計(jì)實(shí)現(xiàn)可幫助學(xué)生理解操作系統(tǒng)設(shè)計(jì)方法,深化對(duì)操作系統(tǒng)運(yùn)行過(guò)程的理解。具體參考實(shí)現(xiàn)如下。
圖2 操作系統(tǒng)實(shí)驗(yàn)設(shè)計(jì)結(jié)構(gòu)
3.2.1 引導(dǎo)程序設(shè)計(jì)與實(shí)現(xiàn)
引導(dǎo)程序的功能為初始化硬件系統(tǒng)、解析并加載操作系統(tǒng)內(nèi)核至指定地址,并跳轉(zhuǎn)至操作系統(tǒng)運(yùn)行。受FPGA片上資源的限制,本實(shí)驗(yàn)針對(duì)picorv32 CPU設(shè)計(jì)了特定的引導(dǎo)程序。其具體的實(shí)現(xiàn)過(guò)程為:首先,引導(dǎo)程序初始化硬件設(shè)備,提供操作系統(tǒng)內(nèi)核運(yùn)行的基本環(huán)境。其次,引導(dǎo)程序?qū)⒁呀?jīng)放置在引導(dǎo)程序后的內(nèi)核壓縮鏡像解壓至SDRAM后通過(guò)絕對(duì)跳轉(zhuǎn)的方式跳轉(zhuǎn)至SDRAM繼續(xù)完成剩余引導(dǎo)啟動(dòng)工作。最后,引導(dǎo)程序跳轉(zhuǎn)至操作系統(tǒng)入口地址完成內(nèi)核啟動(dòng)。
為解決片上ROM存儲(chǔ)空間不足導(dǎo)致內(nèi)核鏡像不能加載的問(wèn)題,引導(dǎo)程序中的解壓縮模塊對(duì)內(nèi)核映像進(jìn)行壓縮處理,為操作系統(tǒng)的啟動(dòng)提供支持。實(shí)驗(yàn)將操作系統(tǒng)內(nèi)核鏡像壓縮為gzip格式文件后,轉(zhuǎn)換為數(shù)組嵌入引導(dǎo)程序。引導(dǎo)程序調(diào)用解壓縮庫(kù)tinf[11]將內(nèi)核壓縮鏡像解壓至SDRAM,并通過(guò)絕對(duì)跳轉(zhuǎn)的方式跳轉(zhuǎn)至內(nèi)核入口執(zhí)行操作系統(tǒng)程序。此外,由于直接調(diào)用tinf解壓縮庫(kù)會(huì)占用太多的存儲(chǔ)空間,因此實(shí)驗(yàn)需要對(duì)tinf解壓縮庫(kù)進(jìn)行適應(yīng)性裁剪,最終達(dá)到節(jié)省一半ROM存儲(chǔ)空間的效果。
3.2.2 操作系統(tǒng)內(nèi)核的設(shè)計(jì)與實(shí)現(xiàn)
操作系統(tǒng)內(nèi)核的設(shè)計(jì)依賴(lài)于硬件平臺(tái)資源,STEP-CYC10開(kāi)發(fā)板上可用的資源包括48 KB片上存儲(chǔ)資源、UART、GPIO、數(shù)碼管等。其中,操作系統(tǒng)代碼壓縮后存儲(chǔ)至ROM,解壓縮至SDRAM后使系統(tǒng)能夠被CPU正常加載執(zhí)行。SoC中的串口設(shè)備保證了操作系統(tǒng)基本的輸入輸出功能,便于用戶(hù)與實(shí)驗(yàn)平臺(tái)上的操作系統(tǒng)進(jìn)行交互。最后,在SDRAM開(kāi)辟空間保證操作系統(tǒng)在運(yùn)行時(shí)能夠加載數(shù)據(jù)和設(shè)置堆棧等程序運(yùn)行所必須的資源支持。
(1)rCore教學(xué)操作系統(tǒng)移植
已有的rCore 操作系統(tǒng) RISC-V版本針對(duì)的硬件開(kāi)發(fā)平臺(tái)為 Sifive 公司發(fā)布的 HiFive Unleashed 開(kāi)發(fā)板。為達(dá)到將 rCore 移植至自行搭建的STEP-CYC10 硬件平臺(tái)的目標(biāo),實(shí)驗(yàn)需修改rCore操作系統(tǒng)的硬件支持,具體內(nèi)容包括修改底層引導(dǎo)程序提供的結(jié)構(gòu)函數(shù),修改依賴(lài)的硬件資源。經(jīng)過(guò)移植后,實(shí)驗(yàn)將選取部分rCore操作系統(tǒng)的功能模塊作為操作系統(tǒng)的實(shí)驗(yàn)提供給學(xué)生。
(2)最小化內(nèi)核實(shí)驗(yàn)
操作系統(tǒng)是一個(gè)直接在硬件上執(zhí)行的程序,這使得操作系統(tǒng)的編寫(xiě)過(guò)程與一般直接在系統(tǒng)中運(yùn)行的可執(zhí)行程序不同,其最大特點(diǎn)是無(wú)法使用依賴(lài)于某特定平臺(tái)的函數(shù)庫(kù)。此外,由于目前編譯器沒(méi)有與硬件平臺(tái)一致的目標(biāo)結(jié)構(gòu),其編譯也必須以特殊方式進(jìn)行。最小化內(nèi)核實(shí)驗(yàn)將作為引導(dǎo)實(shí)驗(yàn)使學(xué)生理解操作系統(tǒng)如何運(yùn)行在裸機(jī)環(huán)境之中。實(shí)驗(yàn)參考過(guò)程的步驟如下。
首先,更改Rust編譯的目標(biāo)架構(gòu),然后使用json文件定義適用于新操作系統(tǒng)的目標(biāo)三元組。在編譯時(shí)通過(guò)--target json文件名指定[12,13]架構(gòu)為riscv,端序?yàn)樾《诵虻刃畔?,同時(shí)指定自定義鏈接腳本對(duì)操作系統(tǒng)進(jìn)行鏈接。
其次,由于操作系統(tǒng)程序無(wú)法訪問(wèn)標(biāo)準(zhǔn)庫(kù),需要設(shè)置不再鏈接標(biāo)準(zhǔn)庫(kù),不再使用Rust默認(rèn)的函數(shù)入口點(diǎn)[12,13],使得最終編寫(xiě)的程序僅使用Rust語(yǔ)言中不依賴(lài)于特定平臺(tái)的core庫(kù)。
最后,使用匯編指令完成初始化堆棧功能。完成初始化工作后,通過(guò)call指令跳轉(zhuǎn)到內(nèi)核main函數(shù)執(zhí)行。
(3)中斷處理實(shí)驗(yàn)
中斷是保證CPU及時(shí)處理外部設(shè)備請(qǐng)求的關(guān)鍵技術(shù)。中斷處理程序的好壞是操作系統(tǒng)運(yùn)行效率高低的重要影響因素。本實(shí)驗(yàn)的中斷處理參考實(shí)現(xiàn)與picorv32 CPU的功能緊密結(jié)合。在picorv32 CPU中,系統(tǒng)預(yù)設(shè)的中斷信號(hào)類(lèi)型有3類(lèi),分別對(duì)應(yīng)下標(biāo)為0、1、2的中斷掩碼位。中斷掩碼位為0則為時(shí)鐘中斷,中斷掩碼位為1則為異常指令ebreak、ecall與非法指令,中斷掩碼位為3則表示訪存地址不對(duì)齊異常。
中斷處理函數(shù)的實(shí)現(xiàn)首先需根據(jù)傳入的中斷掩碼判斷中斷類(lèi)型,然后調(diào)用相應(yīng)的處理函數(shù)。不同中斷的處理函數(shù)規(guī)定了統(tǒng)一的參數(shù)接口,第一個(gè)參數(shù)為指向存儲(chǔ)中斷現(xiàn)場(chǎng)通用寄存器的內(nèi)存指針,第二個(gè)參數(shù)為中斷掩碼類(lèi)型,返回值為指向存儲(chǔ)通用寄存器的內(nèi)存指針。處理函數(shù)的具體實(shí)現(xiàn)由學(xué)生根據(jù)實(shí)驗(yàn)要求編寫(xiě)。比如,當(dāng)運(yùn)行遇到ebreak或非法指令時(shí),參考實(shí)現(xiàn)將打印所有寄存器的值作為調(diào)試信息對(duì)軟件進(jìn)行調(diào)試。
(4)系統(tǒng)調(diào)用實(shí)驗(yàn)
系統(tǒng)調(diào)用是操作系統(tǒng)保護(hù)系統(tǒng)安全和為用戶(hù)程序提供硬件資源訪問(wèn)的入口的有效手段。為實(shí)現(xiàn)對(duì)上層系統(tǒng)提供調(diào)用接口的功能,本實(shí)驗(yàn)設(shè)計(jì)通過(guò)ecall軟中斷的形式提供系統(tǒng)調(diào)用接口,并定義系統(tǒng)調(diào)用函數(shù)的參數(shù)傳遞規(guī)則。系統(tǒng)調(diào)用函數(shù)的參數(shù)傳遞規(guī)則見(jiàn)表2。
表2 系統(tǒng)調(diào)用函數(shù)參數(shù)傳遞規(guī)則
實(shí)驗(yàn)參考設(shè)計(jì)實(shí)現(xiàn)了兩種系統(tǒng)調(diào)用,第一種為SBI_CONSOLE_PUTCHAR系統(tǒng)調(diào)用,即向console打印一個(gè)字符,通過(guò)將第一個(gè)參數(shù)a0傳入的值傳遞給由輸入輸出驅(qū)動(dòng)提供的print_char()函數(shù)實(shí)現(xiàn)功能,返回值為0。第二種為SBI_CONSOLE_GETCHAR系統(tǒng)調(diào)用,即向console打印一個(gè)字符,通過(guò)調(diào)用輸入輸出驅(qū)動(dòng)提供的getchar()函數(shù),對(duì)字符進(jìn)行接收。
(5)串口驅(qū)動(dòng)實(shí)驗(yàn)
為了完成操作系統(tǒng)與上位機(jī)的交互,需要實(shí)現(xiàn)串口功能。操作系統(tǒng)通過(guò)串口向上位機(jī)發(fā)送數(shù)據(jù),上位機(jī)接收后,由串口調(diào)試工具進(jìn)行顯示。驅(qū)動(dòng)程序的編寫(xiě)需針對(duì)特定的串口控制器,本實(shí)驗(yàn)參考實(shí)現(xiàn)的硬件平臺(tái)中使用的是RS-232IP核。該硬件需使用的寄存器包括rxdata、txdata、status寄存器。
串口驅(qū)動(dòng)函數(shù)的實(shí)現(xiàn)為print_char()函數(shù)與get_char()函數(shù)。print_char()函數(shù)的功能為向txdata寄存器發(fā)送數(shù)據(jù),輸入?yún)?shù)為需發(fā)送的字符返回值為0。在發(fā)送數(shù)據(jù)之前,調(diào)用trdy函數(shù)判斷當(dāng)前串口的狀態(tài),若為可發(fā)送狀態(tài),則向txdata寄存器發(fā)送數(shù)據(jù)。getchar()函數(shù)的功能為從rxdata寄存器讀取數(shù)據(jù),無(wú)輸入?yún)?shù),返回值為讀取的寄存器數(shù)據(jù)并將其轉(zhuǎn)換為char類(lèi)型。在讀取數(shù)據(jù)之前,調(diào)用rrdy函數(shù)判斷當(dāng)前串口的狀態(tài),若為可讀取狀態(tài),則從rxdata寄存器讀取數(shù)據(jù)。
(6)格式化輸出實(shí)驗(yàn)
格式化輸出是標(biāo)準(zhǔn)函數(shù)調(diào)用庫(kù)中的常見(jiàn)函數(shù),在用戶(hù)交互功能中起到極其重要的作用,也可作為操作系統(tǒng)實(shí)驗(yàn)的一個(gè)調(diào)試手段。本實(shí)驗(yàn)設(shè)計(jì)將依賴(lài)于Rust core庫(kù)實(shí)現(xiàn)println作為格式化輸出函數(shù),其實(shí)現(xiàn)需調(diào)用自行編寫(xiě)的底層函數(shù)。
實(shí)現(xiàn)格式化輸出時(shí),參考實(shí)現(xiàn)首先編寫(xiě)更為底層的用于輸入輸出的 putchar 和 puts函數(shù),功能分別是輸出單個(gè)字符和輸出字符串,可理解為對(duì)串口驅(qū)動(dòng)函數(shù)的封裝。然后通過(guò)Rust core庫(kù)中帶有用于格式化和打印字符串的庫(kù)fmt實(shí)現(xiàn)println。
3.2.3 程序鏈接與加載
由于picorv32 CPU 并未實(shí)現(xiàn)MMU即內(nèi)存管理單元,并且受到內(nèi)存資源限制操作系統(tǒng)無(wú)法實(shí)現(xiàn)內(nèi)存管理功能,所以實(shí)驗(yàn)中所有地址均為物理地址。代碼與數(shù)據(jù)的地址由鏈接腳本指定,對(duì)引導(dǎo)程序的地址空間分配即為對(duì)全局的地址空間進(jìn)行分配管理。比如,在鏈接腳本中使用MEMORY命令設(shè)置內(nèi)存的起始地址與大小并指定內(nèi)存類(lèi)型;指定ROM存儲(chǔ)可執(zhí)行代碼段以及只讀數(shù)據(jù),SDRAM存儲(chǔ)數(shù)據(jù)段以及bss段;使用AT 命令指定數(shù)據(jù)段的加載地址等。
在將操作系統(tǒng)與用戶(hù)程序鏈接完成后,本實(shí)驗(yàn)軟件系統(tǒng)各部分地址分布如圖3所示。
圖3 操作系統(tǒng)與用戶(hù)程序地址分布
在完成操作系統(tǒng)、用戶(hù)程序與引導(dǎo)程序的鏈接后,通過(guò)工具鏈將上述3個(gè)模塊合并為一個(gè)二進(jìn)制文件,并轉(zhuǎn)化為Hex文件作為ROM模塊的初始化數(shù)據(jù)。為確保不會(huì)出現(xiàn)由于功能過(guò)多而導(dǎo)致的片內(nèi)存儲(chǔ)空間無(wú)法放置完整內(nèi)核鏡像的問(wèn)題,實(shí)驗(yàn)將對(duì)操作系統(tǒng)內(nèi)核進(jìn)一步進(jìn)行壓縮處理。
首先,實(shí)驗(yàn)通過(guò)工具鏈將操作系統(tǒng)內(nèi)核轉(zhuǎn)化為數(shù)據(jù)段與代碼段等不同程序段直接加載至引導(dǎo)程序指定位置,以簡(jiǎn)化操作系統(tǒng)內(nèi)核加載流程。其次,將加載了操作系統(tǒng)內(nèi)核代碼段、數(shù)據(jù)段以及用戶(hù)程序的引導(dǎo)程序編譯鏈接為二進(jìn)制文件,將該二進(jìn)制文件進(jìn)行g(shù)zip格式壓縮得到操作系統(tǒng)壓縮鏡像,通過(guò)文件轉(zhuǎn)換器將該壓縮鏡像轉(zhuǎn)換為數(shù)組。最后,將數(shù)組嵌入解壓縮程序。通過(guò)上述裁剪與壓縮處理后的操作系統(tǒng)內(nèi)核鏡像僅占用一半左右片上存儲(chǔ)空間,為豐富操作系統(tǒng)實(shí)驗(yàn)內(nèi)容提供了可行性。
本研究提供的操作系統(tǒng)實(shí)驗(yàn)參考實(shí)現(xiàn)在移植的rCore操作系統(tǒng)的基礎(chǔ)上,選取部分核心功能,實(shí)現(xiàn)了中斷處理、系統(tǒng)調(diào)用等模塊,最終適配以picorv32 CPU為核心的SoC系統(tǒng),并在STEP-CYC10開(kāi)發(fā)板上成功運(yùn)行。
在進(jìn)行操作系統(tǒng)實(shí)驗(yàn)時(shí),建議同學(xué)在教學(xué)提供的picorv32 CPU基礎(chǔ)上,依據(jù)實(shí)驗(yàn)要求結(jié)合CPU的功能,以參考實(shí)現(xiàn)中給出的引導(dǎo)程序、解壓縮模塊等作為實(shí)驗(yàn)支持模塊,在模擬器中調(diào)試,再進(jìn)一步適配到STEP-CYC10硬件平臺(tái)以完成操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。
為了方便故障檢測(cè),需通過(guò)標(biāo)準(zhǔn)測(cè)試集對(duì)實(shí)驗(yàn)平臺(tái)進(jìn)行測(cè)試。首先,硬件系統(tǒng)通過(guò)由算數(shù)和邏輯運(yùn)算等指令構(gòu)成的測(cè)試指令集對(duì)硬件實(shí)驗(yàn)中的CPU功能進(jìn)行測(cè)試,測(cè)試結(jié)果通過(guò)串口進(jìn)行打印。學(xué)生可通過(guò)打印結(jié)果判斷實(shí)驗(yàn)是否通過(guò)或定位錯(cuò)誤出現(xiàn)位置,也可添加LED與數(shù)碼管作為支持模塊協(xié)助檢測(cè)錯(cuò)誤原因。其次,軟件系統(tǒng)通過(guò)打印中斷信息、實(shí)現(xiàn)函數(shù)追蹤與數(shù)據(jù)打印功能,若出現(xiàn)故障可通過(guò)串口向軟件系統(tǒng)發(fā)送命令打印故障地址及地址對(duì)應(yīng)數(shù)據(jù)深入查找故障。硬件系統(tǒng)與軟件系統(tǒng)測(cè)試示例具體如下。
(1)組成原理實(shí)驗(yàn)測(cè)試結(jié)果
圖4所示為基于picorv32 CPU測(cè)試指令集對(duì)搭建的硬件系統(tǒng)實(shí)驗(yàn)平臺(tái)進(jìn)行測(cè)試的部分結(jié)果,測(cè)試結(jié)果通過(guò)串口模塊輸出,打印至上位機(jī)串口調(diào)試工具。其中指令集每測(cè)試一條指令,若通過(guò)則打印“OK”。通過(guò)指令集測(cè)試驗(yàn)證了搭建的參考實(shí)現(xiàn)的硬件系統(tǒng)實(shí)驗(yàn)平臺(tái)可正確運(yùn)行。
圖4 組成原理實(shí)驗(yàn)測(cè)試
(2)操作系統(tǒng)實(shí)驗(yàn)測(cè)試結(jié)果
圖5所示為操作系統(tǒng)實(shí)驗(yàn)參考實(shí)現(xiàn)測(cè)試結(jié)果。操作系統(tǒng)通過(guò)串口與上位機(jī)實(shí)現(xiàn)了數(shù)據(jù)交互,完成了中斷測(cè)試、解壓縮、操作系統(tǒng)啟動(dòng)及用戶(hù)程序解析等功能。同時(shí)通過(guò)串口對(duì)操作系統(tǒng)發(fā)出命令可實(shí)現(xiàn)流水燈、數(shù)碼管顯示、函數(shù)地址跟蹤及數(shù)據(jù)監(jiān)測(cè)等功能,完成了對(duì)自行設(shè)計(jì)的CPU核心功能的測(cè)試。
圖5 操作系統(tǒng)實(shí)驗(yàn)測(cè)試
本文設(shè)計(jì)了一種計(jì)算機(jī)系統(tǒng)綜合實(shí)驗(yàn)平臺(tái)。該平臺(tái)可根據(jù)教學(xué)需求完成計(jì)算機(jī)組成原理與操作系統(tǒng)實(shí)驗(yàn),在有限的成本下達(dá)到綜合教學(xué)的目的。實(shí)驗(yàn)平臺(tái)以RISC-V CPU為核心在小型FPGA開(kāi)發(fā)板上搭建了可用于計(jì)算機(jī)組成原理實(shí)驗(yàn)的硬件實(shí)驗(yàn)平臺(tái),同時(shí)在硬件平臺(tái)上實(shí)現(xiàn)了rCore操作系統(tǒng)的移植,完成了操作系統(tǒng)實(shí)驗(yàn)的參考實(shí)現(xiàn),最終形成了完整的計(jì)算機(jī)系統(tǒng)教學(xué)實(shí)驗(yàn)平臺(tái),并給出該實(shí)驗(yàn)平臺(tái)的測(cè)試和應(yīng)用方法。但由于受到硬件系統(tǒng)功能的限制,picorv32 CPU未實(shí)現(xiàn)mmu功能,因此操作系統(tǒng)未實(shí)現(xiàn)頁(yè)表、虛擬內(nèi)存等功能。其次由于片上存儲(chǔ)資源不足,并未實(shí)現(xiàn)文件系統(tǒng)。針對(duì)上述問(wèn)題,正在積極探索改進(jìn)更換帶有mmu功能的CPU,同時(shí)嘗試增加片外Flash以求增加更多可用的存儲(chǔ)資源來(lái)完善操作系統(tǒng)實(shí)驗(yàn)的功能。