賽靈思 Spartan-3開發(fā)板成為作者改進(jìn)其軟件教育用的Oberon 編程語言和編譯器的基礎(chǔ)。
1988 年,Jürg Gutknecht 和我一起完成并出版了Oberon 編程語言[1,2],其為我職業(yè)生涯早期開發(fā)的另外兩種編程語言Pascal 和Modula-2 的后續(xù)版本。與Modula-2 相比,我們最初設(shè)計(jì)Oberon 編程語言力求更加精簡和高效,以便能夠更好地幫助教學(xué)人員為計(jì)算機(jī)科學(xué)專業(yè)的學(xué)生教授系統(tǒng)編程。我們再接再勵(lì),于1990 年針對可采用windows 系統(tǒng)和具有字處理能力的工作站開發(fā)了Oberon 操作系統(tǒng)(OS),以此作為工作站的現(xiàn)代實(shí)現(xiàn)方式。接著,我們出版了一本書,名為《Project Oberon》,詳細(xì)講解了Oberon 編譯器以及與之同名的操作系統(tǒng)。此外,書中還包括詳細(xì)的指令和源代碼。
幾年前,我的朋友Paul Reed 建議我重新修訂并再次出版這本書,不僅因?yàn)檫@本書對系統(tǒng)設(shè)計(jì)教學(xué)具有重要價(jià)值,同時(shí)還因?yàn)檫@本書可以作為良好的切入點(diǎn),幫助那些想要成為創(chuàng)新者的人們從零基礎(chǔ)構(gòu)建可靠的系統(tǒng)。
然而,我當(dāng)時(shí)實(shí)際上是遇到了很大的困難。我最初開發(fā)的編譯器是將已基本消失了的處理器作為目標(biāo)。因此,我的解決辦法就是為現(xiàn)代處理器重新編寫編譯器。但在做了不少研究之后,我無法找到一款能夠在清晰度、規(guī)律性和簡潔性上符合我標(biāo)準(zhǔn)的處理器。因此,我自己設(shè)計(jì)了這款編譯器。而我之所以能夠?qū)⒃撓敕ǜ吨T實(shí)現(xiàn),都是因?yàn)楝F(xiàn)代FPGA 能夠幫助我設(shè)計(jì)硬件以及系統(tǒng)軟件。更重要的是,選擇賽靈思FPGA 能幫助我更新系統(tǒng),同時(shí)讓設(shè)計(jì)盡可能接近自1990 年以來的原始版本。
實(shí)現(xiàn)在低成本Digilent Spartan?-3開發(fā)板上的新型處理器RISC 負(fù)責(zé)托管1MB 靜態(tài)RAM (SRAM) 內(nèi)存。我唯一添加的系統(tǒng)硬件就是一個(gè)鼠標(biāo)接口和一個(gè)用來替換舊系統(tǒng)中硬盤驅(qū)動(dòng)器的SD 卡。
這本書和面向整個(gè)系統(tǒng)的源代碼可在projectoberon.com[3,4,5] 中查閱,也可在該網(wǎng)站上名為 S3RISCinstall.zip. 的單個(gè)文件中進(jìn)行查閱。該文件包含指令、SD 卡文件系統(tǒng)圖像和FPGA 配置比特文件(對于Spartan-3開發(fā)板的 Platform Flash,此為PROM文件形式),以及SD 卡/ 鼠標(biāo)接口硬件的構(gòu)造詳圖。
RISC處理器
該處理器由算術(shù)邏輯單元、由16 個(gè)32 位寄存器組成的陣列和帶指令寄存器、IR 及程序計(jì)數(shù)器PC 的控制單元組成。Verilog 模塊RISC5 就是該處理器的典型代表。
該處理器具有20 種指令:4 種用于移動(dòng)、偏移和旋轉(zhuǎn);4 種用于邏輯運(yùn)算;4 種用于整數(shù)運(yùn)算;4 種用于浮點(diǎn)運(yùn)算;2 種用于存儲(chǔ)器訪問;2 種用于分支。
RISC5 通過運(yùn)行環(huán)境RISC5Top導(dǎo)入。該運(yùn)行環(huán)境包括到各種(內(nèi)存映射)器件和SRAM(256M×32 位)的接口。整個(gè)系統(tǒng)(圖1)包括以下Verilog 模塊(見行統(tǒng)計(jì)):
?
圖1 – 該系統(tǒng)及其所含Verilog模塊的方框圖
?
?
我將內(nèi)存映射到黑白VGA 顯示器中,這樣它只占用1024×768×1位/ 像素=98304 字節(jié),基本上占 1MB 可用主內(nèi)存的10%。該SD 卡將取代初始系統(tǒng)中80MB 的硬盤驅(qū)動(dòng)器,其可通過能夠接受并序列化字節(jié)或32 位字的標(biāo)準(zhǔn)SPI 接口進(jìn)行存取。鍵盤和鼠標(biāo)通過標(biāo)準(zhǔn)PS-2 串行接口連接。此外,還提供一根串行異步的RS-232 線和一個(gè)通用8 位并行的I/O接口。模塊RISC5Top 還帶有一個(gè)每毫秒采用增量式計(jì)數(shù)的計(jì)數(shù)器。
OBERON操作系統(tǒng)
該操作系統(tǒng)軟件由包括內(nèi)存分配器(帶垃圾回收器)的內(nèi)核、文件系統(tǒng)以及引導(dǎo)載入程序、文本系統(tǒng)、瀏覽器系統(tǒng)和文本編輯器組成。
名為“Oberon”的模塊是中心任務(wù)調(diào)度程序,而“System”是基礎(chǔ)命令模塊。通過點(diǎn)擊顯示器上任何瀏覽器文本“M.P”上的中間按鈕即可觸發(fā)動(dòng)作,其中P 是模塊M 聲明的程序名。如果M 不存在,則會(huì)自動(dòng)加載。但是,大多數(shù)文本編輯命令是通過簡單的鼠標(biāo)點(diǎn)擊觸發(fā)的。其中,左邊一欄按鈕用來設(shè)置" 脫字" 符,標(biāo)記文本位置,右邊一欄按鈕用來選擇文本字段(text stretch)。
“Kernel”模塊包括磁盤存儲(chǔ)管理和垃圾回收器。我保證觀察瀏覽器是平鋪的,不重疊。標(biāo)準(zhǔn)布局顯示了多個(gè)瀏覽器的兩條垂直軌跡。只需拖動(dòng)標(biāo)題欄,就可以放大、縮小或移動(dòng)它們。圖2 顯示了在顯示器上運(yùn)行的用戶界面以及Spartan-3 開發(fā)板、鍵盤及鼠標(biāo)。
?
圖2 - 顯示用戶界面的顯示器(Spartan-3開發(fā)板在右側(cè))
加載時(shí)系統(tǒng)占用模塊空間112640字節(jié)(21%),占堆(heap) 的16128字節(jié)(3%)。系統(tǒng)包括所以下幾個(gè)模塊(見行統(tǒng)計(jì)),如圖3 所示:
?
圖3 - 系統(tǒng)及其模塊
?
?
值得注意的是,該系統(tǒng)在加電或重置時(shí),完成初始化僅需兩秒鐘。這包括文件目錄中垃圾回收掃描。
OBERON編譯器
系統(tǒng)自帶的編譯器采用簡單的自上而下遞歸下降分析法。用戶使用ORP.Compile @ 命令即可激活模塊選定的源文本上的編譯器。 包解析器通過掃描儀輸入各種符號,包括識別符、數(shù)字和特殊符號(如BEGIN、END、+等)。該方案已被證明在許多應(yīng)用中有效且均表現(xiàn)不凡。這點(diǎn)在我著的書《編譯器結(jié)構(gòu)》[6,7] 中有詳細(xì)說明。
該包解析器調(diào)用代碼生成程序模塊中的程序。這些程序直接將指令添加在代碼陣列上。如果已知所有分支目的地,向前跳轉(zhuǎn)指令(forwardbranch instructions)在模塊編譯結(jié)束時(shí)則會(huì)提供跳轉(zhuǎn)地址(修正)。
所有可變地址都與基址寄存器關(guān)聯(lián)。這就是用于局部變量(運(yùn)行時(shí)設(shè)置在程序輸入)的R14(堆棧指示器)或用于全局和輸入變量的R13。
基址地址按要求通過地址保存在寄存器R12 內(nèi)的系統(tǒng)全局模塊表載入。R15 用于RISC 架構(gòu)確定的返回地址(鏈接)。因此,R0-R11 可用于表達(dá)式評估和傳遞過程參數(shù)。
整個(gè)編譯器由4 個(gè)相對較小的有效模塊組成(見行統(tǒng)計(jì)):
?
編譯器占用115912 字節(jié)(22%)的模塊空間和17508 字節(jié)(4%)的堆空間(編譯之前)。其源代碼長約65KB。編譯器自身的編譯在25 MHzRISC 處理器上只需幾秒鐘[8]。
編譯器通常使用值為NIL 的指示檢查數(shù)組索引和基準(zhǔn)值。如果違反規(guī)定,這會(huì)造成陷阱。這種技術(shù)具有高度的安全性,防止錯(cuò)誤和崩潰。事實(shí)上,只能通過采用偽模塊SYSTEM 中的操作,即PUT 和COPY,才能防礙系統(tǒng)的完整性。這些操作必須局限于接入器件接口的驅(qū)動(dòng)模塊。在輸入列表中,通過SYSTEM 很容易識別它們。整個(gè)系統(tǒng)采用Oberon 編程,無需使用匯編碼。
我選擇Digilent Spartan-3 開發(fā)板是由于其成本低、操作簡便,這使其適于教育機(jī)構(gòu),以獲得整套課堂教學(xué)套件。一個(gè)重大優(yōu)勢就是該開發(fā)板上有靜態(tài)RAM,使得接口連接非常簡單直觀(甚至用于字節(jié)選擇)。遺憾的是,所有新開發(fā)板均采用動(dòng)態(tài)RAM,雖然存儲(chǔ)空間更大,但接口連接復(fù)雜得多,因此刷新和初始化(校準(zhǔn))需要電路。這一電路與帶靜態(tài)RAM 的整個(gè)處理器一樣復(fù)雜。即使控制器以單片式提供,這有悖于我們的開放檢查原則。
最后的想法
40 多年前,C.A.R. Hoare 說,在科學(xué)技術(shù)的所有分支學(xué)科中,學(xué)生在被要求用實(shí)驗(yàn)嘗試自己的想法之前,容易受到許多示范性設(shè)計(jì)實(shí)例的影響。編程和軟件設(shè)計(jì)與這種明智模式形成了鮮明對比。這里,在閱讀任何實(shí)例之前,要求學(xué)生從一開始就編寫程序。
這種可怕事實(shí)的原因就是:幾乎不存在大小合適的示范實(shí)例。因此,我決定稍微修正這種情形,我在1975年編寫了《算法與數(shù)據(jù)結(jié)構(gòu)》一書。隨后(與J. Gut-knecht)負(fù)責(zé)操作系統(tǒng)教學(xué)任務(wù),我設(shè)計(jì)了Oberon 系統(tǒng)(1986-88)。
此后,編程教學(xué)并沒有明顯提高,而系統(tǒng)的規(guī)模和復(fù)雜性顯著增加。雖然開源的努力頗受歡迎,但它并沒有真正改變這種形勢,因?yàn)榇蠖鄶?shù)程序已經(jīng)建成“運(yùn)行”,但卻沒有真正投入使用。
我繼續(xù)大膽提議,應(yīng)重新設(shè)計(jì)所有程序,不光是計(jì)算機(jī),還有讀取方式。這些程序應(yīng)是可發(fā)行的。即便這種方法正確而有效,但這是一項(xiàng)比創(chuàng)建可執(zhí)行程序更為艱難的任務(wù)。這意味著,沒有任何部分必須用匯編碼指定。
忽略在這種“人為因素”的結(jié)果就是,在許多地方,新的應(yīng)用沒有得到精心設(shè)計(jì),而是通過消除程序中錯(cuò)誤來實(shí)現(xiàn),其結(jié)果有時(shí)是令人擔(dān)憂的。要做到“易懂”的關(guān)鍵就是堅(jiān)持簡單性和規(guī)律性,放棄不必要的修飾,避免花里胡哨,正確區(qū)分傳統(tǒng)與便捷。
該系統(tǒng)所占空間小,是小資源實(shí)現(xiàn)大作為的見證。雖然Oberon 系統(tǒng)包含一個(gè)文件系統(tǒng)、文本編輯器和瀏覽器(Windows)管理程序,但相比多數(shù)現(xiàn)代操作系統(tǒng)而言,其占用的空間少得可憐。意外的是它僅僅依靠一些簡單規(guī)則,因此便于學(xué)習(xí)如何使用。
最后,這種簡單的系統(tǒng)的另一大優(yōu)勢就是,用戶可以在該基礎(chǔ)系統(tǒng)上安全構(gòu)建所需程序,而不必?fù)?dān)心是否存在未知特征與功能,如后門程式(back door)。從系統(tǒng)完整性易受到攻擊的角度看,這是一個(gè)基本屬性,是關(guān)鍵安全型應(yīng)用不可或缺的。值得注意的是,我們的系統(tǒng)硬件沒有這種隱藏元件。畢竟,在如此之大而又沒人能夠完全了解的基礎(chǔ)上構(gòu)建的任何系統(tǒng)也不能予以保證。
致謝
我衷心感謝Paul Reed 所做的寶貴貢獻(xiàn)。他建議我重新編撰《Oberon 項(xiàng)目》一書,還建議在FPGA 上重新實(shí)現(xiàn)整個(gè)系統(tǒng)。Paul 一直激勵(lì)著我。他想到過用SD 卡替代磁盤,他為SPI、PS-2 和Verilog 中的VID 接口做出了卓越貢獻(xiàn)。
?
評論
查看更多