rrxv6 : virtio

在去年五月上一回的文章 中,我們做到了 OS 版的 hello world, 讓 user process 呼叫 print 的 syscall,並由 OS 處理該 syscall 印出 hello world。
在這之後我花了一段時間(好長的一段)思考到底要做什麼,後面 xv6 依序初始化的東西包括幾個:

  1. buffer cache
  2. inode table
  3. file table
  4. virtio
  5. 做更多 user process 相關的部分

後來發現 1,2,3 都相依於 4,沒有 virtio 讀不了磁碟那還管什麼 file, inode; User process 在沒有 4 的狀況下,寫起來也是綁手綁腳,於是就決定先挑戰 qemu 的 virtio。

...

rrxv6 : syscall

上一回我們進入 User Mode,打鐵趁熱這回就來處理 User Mode 下的 interrupt , 以及實作其中一種比較特殊的 interrupt,也就是 system call。

...

rrxv6 : user mode

上一回我們實作完 scheduler 之後,下一個大項目就是進入 user space 以及 system call 了,

有了這篇一般使用者和作業系統才能真的分隔開來,使用者行程在獨立的空間,以受限的權限運作,作業系統則從外管理使用者行程。

...

rrxv6 : scheduler

上次我們發佈 rrxv6 的文章,已經是 2021 年 12 月的事情了,已經是去年了,大家可能以為我已經棄更了?
其實沒有的,只是跟上次的 virtual memory 一樣卡關了。

1-2 月的時候,台北的天氣鳥得跟好市多的冷藏區一樣,冷就算了還天天下雨,起床之後在雨聲裡開工,中餐晚餐撐傘出去買飯, 在雨聲裡睡午覺,在雨聲裡說晚安,房間除溼開整天,到後來整個人都覺得不對勁了,還小病了一場一個星期捅了三次鼻孔; 二月俄烏又開戰幹普丁還我錢,有大事的時候真的會忍不住一直嘗試更新資訊,然後工作效率就降到低點QQ, 直到三月吸飽太陽能之後有好一點點。

...

rrxv6 : interrupt

故事是這樣子的,上一章的結尾雖然寫了:

下一步就可以開始初始化 kernel 的 process table 啦。

但事後發現,原來還有東西比建立 process 更重要的,那就是先把 trap 給建立好:

trap

...

rrxv6 : virtual memory

上次我們發佈 rrxv6 的文章,已經是八月的事情了,大家可能以為我已經棄更了? 其實這個小弟也有在認真反省,在我停更 rrxv6 這段期間剛好看到傳說中的 jserv 大神貼文:

到底高等教育出了什麼問題?為何很大比例的電機資訊畢業生,沒辦法堅持把事情做好?
思索九年,我想自己理解部分的原因:扎實地做事難以獲得短期的讚揚,而台灣許多人無法等到長期效益落實的那刻……。

想說靠北這不就是在說我嗎QQ,一直以來都沒把事情做好,像 ruGameboy 最後就被我棄更了,現在變成十八般武藝樣樣稀鬆只能混口飯吃。

...

rrxv6 : Memory Allocator

故事是這樣子的,雖然在上上篇的 Context Switch 我們曾經預告過因為 static 的問題, 可能要停更一段時間,但後來沒停更,static 問題很快就用 spin 提供的 no_std Mutex 解決了。
不過,no_std Mutex 雖然解決 static 不用手爆 constructor 的問題,同時卻產生了另一個問題:stack overflow。

因為呼叫 static variable constructor 會用到 os process 的 stack,static variable size 一大,os process 的 stack 就會被吃乾抹淨。
所以問題來了,我們必須要儘可能的縮小 static variable 的尺寸,像上篇把 process 的 context 全塞在裡面是不可能的 (為了讓 code 動起來我把 process 數量降到剩 2 個),因此下一步就很清楚了,必須挑戰作業系統裡一大難題:記憶體管理

...

rrxv6 : spin mutex

故事是這樣子的,上一篇我們使用 unsafe 來操作 global variable,並用這個做到 cooperative multitask, 很不幸的這個方法是不行的,包括幾個問題:

  1. 身為 Rustacean 非不得已怎麼可以用 unsafe 呢?這樣狂用 unsafe 根本離經叛道
  2. 當 static 的型態複雜到一個程度的時候,這樣手爆資料型態絕不是方法,一定要使用 default 才行。

稍微搜尋一下之後,果然找到一個可行的方案,用社群提供的 crate spin , 可以在 #[no_std] 的狀況下提供 Mutex(有關如何實作 Rust Mutex,' 可以參見這篇文章

...

rrxv6 : Context Switch 與 Global Data

首先先預告一下,這篇有可能會是本系列連續更新的最後一篇,更新完這篇之後我要去閉關念書(看 code)一段時間,原因我等等會說明。

上一篇我們提到在 rust 裡面實作實際對應實體暫存器的程式碼,同時也確定這些程式碼可以真的提供無額外成本的虛擬化, 這篇順著 mini-arm-os 的腳步,來實作 Context Switch;timer 的設定我們先跳過,畢竟這篇還不會實作到 timer interrupt 觸發 context switch。

...

rrxv6 : Embedded Rust

上一回我們看到我們用 rust 寫了一些底層的 code,當然,這個寫法並不好看,有沒有更漂亮的寫法呢? 這篇參考了 rust cortex-m 的寫法, 以及強者我同學在 Google 大殺四方的小新大大分享的文 A guide to better embedded C++

...