第一次參與這個比賽,既期待又怕沒有足夠實力體力完成,看著前人所寫的文章洋洋灑灑,為後人鋪路,不論是技術性的文章,亦或是記錄下來留給自己的紀念,對於後人的幫助或多或少,也願自己的拙作能幫助到需要的朋友。這次比賽不僅能幫助增進自己的基本能力,也能養成每日閱讀的良好習慣,最後當然是能提高自己的知識水平啦。
在同事半推慫恿之下參與了此次比賽,當下除了錯愕之外也滿是驚喜,錯愕的是不確定是否真的有能力完成每日一篇文章的習慣,但驚喜的是,剛好藉由此次比賽也能分享在公司,所學習到的相關知識,算是對自己的一次評量。正所謂千里之行始於足下,雖然目前實力不如許多大神,但期許通過一次次的學習,在日後能與他們旗鼓相當。
希望自己的用字遣詞,能順利傳達給每位朋友,若有不正確或是不明白的地方歡迎一同討論。
此次比賽主要是介紹 risc-v 相關議題,但並不會 risc-v 的總總細節都探討,預計會探討的部份,包含 risc-v CSR、特權模式、PLIC,再到較新穎的 AIA(Advanced Interrupt Architecture) 架構,最後則會介紹 perf,過去 perf 在 risc-v 上會遇到哪些限制,以及該如何處理,都會在這個系列當中與大家分享。
下圖是大概的行程規劃:
以為筆者會從什麼是 risc-v 歷史開始介紹嗎?不!可不會呢~不過附上 wiki 連結也是 Okder ,看完肉肉的 wiki 不知是否對 risc-v 有概念了呢?下面讓筆者介紹 risc-v 的特權架構吧!
本系列聚焦在機器模式( Machine mode )與監管者模式(Supervisor mode),以下簡稱 M-mode, S-mode。
RISC-V 一大特色是利用不同特權等級來保護系統的安全,M-mode 是唯一硬體必須實作也是最高權限的特權模式,能夠存取所有硬體資源,S-mode 是作業系統層級的軟體,或是教科書上所說的核心模式(kernel mode), 這一層可以啟用虛擬記憶體,再上一層就是使用者模式(user mode). 示意圖可參考下圖,越往下表示權限越高。
硬體實作可以根據需求,選擇不同的特權等級的組合:
以 Linux 來舉例,Linux 核心本身即運作在監管者模式的軟體,而所有從呼叫第一隻使用者空間(userspace)程式 /sbin/init
(常見的為 busybox 用於嵌入式系統與 Ubuntu 等 Linux 發行版使用的 systemd) 開始到我們的 shell, daemon 與各種套件將執行在使用者模式,透過 exception 與 interrupt 在各層之間移交權限,例如透過 ecall
產生環境呼叫異常(environment call exception)將權限升級並處理之後用 mret
或 sret
來退回低權限的環境。這種軟體主動觸發異常的方式, RISC-V 的分別有 SBI(Supervisor binary interface)與 ABI(Application binary interface)兩個界面來統一各層的呼叫方式,前者也有規格書定義, 這個系列關注的軟體實作是 OpenSBI,後者則是 GNU C Library (glibc)來包裝系統呼叫。
RISC-V 大部分功能都能透過使用 csr*
系列控制狀態暫存器 (CSR) 讀寫指令來操作硬體。
未來會介紹如何使用 csr* 相關指令以及 sbi_ecall 的使用方式
今天介紹了 risc-v 的特權架構,簡單歸納重點,risc-v 分為三種特權模式 M、S、U mode,想從 S mode 到 M mode 需要特定方式,也就是 sbi_ecall 的方式。
明天介紹 risc-v 的 CSR,由於 CSR 的數量不少,因此筆者並不會一個個介紹,而是挑出筆者認為相對常使用的。那我們明天見吧!開心 (ノ>ω<)ノ 第一天就這樣過去了。
《The RISC-V Instruction Set Manual Volume II: Privileged Architecture》