|
|
教學(xué)公告
我的國賽OS比賽經(jīng)驗分享:從選題到?jīng)Q賽
----------
一、選題
我認為一個科班出身的程序員,最重要的能力就是 “知道自己不知道”,換言之就是能夠清晰地評價的自己的技術(shù)儲備和代碼水平。在選題前,需要根據(jù)自己以及隊友的能力選擇一條合適的賽道。
內(nèi)核賽道的優(yōu)勢是參賽隊伍較少,但對應(yīng)的難度較高,且賽題難度是逐年遞增的(25屆的初賽已經(jīng)出現(xiàn)了24屆的決賽賽題)。內(nèi)核賽道的基本比賽形式是選擇一個 base OS,在這個基礎(chǔ)上逐漸添加功能,通過賽題給出的測例即可。這個過程不是一蹴而就的,而是需要選擇并學(xué)習(xí)一個合適的OS項目,充分理解項目之后再進行工作。
一開始,我選擇的是內(nèi)核賽道,我以 rcore-os 的 risc-v 版本為基礎(chǔ)開始了大約3個月左右的學(xué)習(xí)。但是在4月份左右我意識到,以我當(dāng)前的進度和人手儲備可能不足以完成內(nèi)核賽道的開發(fā)任務(wù)。幸好我及時和李老師溝通,最終決定換成了 功能賽道。
但學(xué)習(xí) rcore-os 的過程并沒有白費,我在這個過程中完整學(xué)習(xí)了 Rust 語言如何進行系統(tǒng)級開發(fā),包括 no-std 的配置,一些基礎(chǔ)的宏(比如 println)的手工實現(xiàn)乃至 bootloader 的原理,這為我后續(xù)在功能賽道的開發(fā)節(jié)省了大量時間。
與內(nèi)核賽道的統(tǒng)一標準不同,功能賽道由各種各樣的單一賽題組成,選手只需要選擇一個賽題完成即可,其中也包括像“xv6教學(xué)課程”這種技術(shù)含量較低的賽題。因此參與人數(shù)比內(nèi)核賽道更多,25屆初賽有400多支隊伍報名功能賽道。
雖然功能賽道賽題多樣,但我還是希望能找到內(nèi)核相關(guān)的賽題。也巧,proj-278 就是一個對我胃口的題目:開發(fā)一個基于 x86-64 架構(gòu)的 Rust 內(nèi)核。結(jié)合我的技術(shù)儲備,我在聯(lián)系了賽題老師(這點很重要,一定要先聯(lián)系老師確定標準)后選擇了這個賽題。
----------
二、開發(fā)
我選擇了 blog_os 為基礎(chǔ)進行開發(fā),這是一個非常經(jīng)典的OS內(nèi)核項目,同樣是基于 x86-64 架構(gòu)。這個項目其實已經(jīng)實現(xiàn)了很多賽題278的要求:內(nèi)存管理、中斷處理等等,但整體過于簡單了,而且很多技術(shù)已經(jīng)過時:比如VGA顯示以及PIC8259實現(xiàn)外部中斷。
在初賽階段,我的工作主要是:
-
實現(xiàn)了以 PIC8259 為基礎(chǔ)的鼠標中斷。
-
修改了內(nèi)存管理的部分,增加了一個 池化分配 的策略:在內(nèi)核初始化時,提取分配一部分物理內(nèi)存到一個內(nèi)存池,分配時直接從池子取而無需調(diào)用內(nèi)存分配。
-
增加任務(wù)模塊,基于定時器中斷實現(xiàn)一個簡單的 時間片輪轉(zhuǎn)調(diào)度 的任務(wù)模塊。
-
將VGA文字模式升級為 VGA圖形模式,重構(gòu)
print和println等輸出宏。 -
在第4點的基礎(chǔ)上,實現(xiàn)了一個 簡單的圖形界面,包括一系列圖形繪制函數(shù)、窗口管理器以及事件管理器,通過事件循環(huán)模型不斷捕獲鼠標、鍵盤中斷觸發(fā)的對應(yīng)事件做出行為。
我的項目叫 Rix-os,起這個名字一是致敬我第三喜歡的 Linux 發(fā)行版 NixOs,二是簡短好記。新生的 Rix-os 非常簡陋,一堆過時的 crate,沒有文件系統(tǒng),系統(tǒng)調(diào)用只實現(xiàn)了基本的 sys_exit 之類的,甚至有1/3左右的代碼來自別人。但幸好它幫我通過了初賽,總分36分取得了31分的成績。
進入決賽后,我開始思考 “能讓我的項目和其他隊伍的項目區(qū)分開的東西是什么?”
最終我把重點放在了 圖形界面的優(yōu)化 上,出于以下考慮:
-
相較于其他模塊,圖形界面的優(yōu)化更容易 直觀對比 出來(主要是VGA圖形模式只有324*200的顯示率,過于模糊了)。
-
中斷、內(nèi)存這些模塊,一直都是OS方向的主題,功能賽道甚至有不少專門針對這方面的賽題,如果重點更新這里,可能會失去賽題本身的優(yōu)勢。
因此,我選擇了以更新圖形界面為主。更新圖形界面是個牽一發(fā)而動全身的工程,我的具體升級路線大概是:
更新 bootloader,升級為用 UEFI 引導(dǎo)啟動磁盤鏡像 → 更新內(nèi)存管理等模塊,使用新的 bootloader_api → 更新輸出方式,使用線性幀緩沖來作為輸出。
順便把中斷系統(tǒng)也更新為現(xiàn)代化的 APIC 實現(xiàn),拋棄了老舊的 8259pic 芯片。
----------
一些感想與祝福
復(fù)盤進入決賽后的開發(fā),其實我個人認為主要是開發(fā)時間不太夠,這點必須承認。因為決賽前的開發(fā)主要是在7-8月份,由于要準備考研,其實留給開發(fā)的時間并不多。
當(dāng)然也和我本人的心態(tài)有關(guān),因為我其實并沒有對決賽拿成績抱有特別大的期望,只要能夠去決賽的現(xiàn)場就已經(jīng)讓我非常滿足,后面拿到獎項屬于是意外之喜。
所以希望大家能夠想清楚 這個比賽對自己意味著什么?需要付出多少來對待? 這是我認為需要好好考慮的。
夏天是努力的季節(jié),希望大家在人生的每一個夏天都能做出對得起自己、對得起人生的決定,祝好!

