在諸多學門之中,資訊科學可說是相當年輕的一支,就算僅僅發展數十年,其不成比例的影響力仍然形塑今日人們的科技生活的所有面向。其中,許多觀念、理論、技術經過歲月的淘洗,成為內行不可不知、外行也常常略有耳聞的普及知識。這樣的例子俯拾皆是,比方說經典的 quick sort 演算法、判定人工智慧的圖靈測試、或是由學術網路發展成全球通訊框架的網際網路等等。
在這次的鐵人挑戰賽之中,筆者準備介紹的不是那些搏人目光的熱門詞彙或是趨勢,而是非常樸實、默默耕耘,在各種電腦系統之中持續運行的一個核心要素:ELF (Executable and Linkable Format),也就是 Unix-like 系統中最為通用的二進位檔案格式。若將資訊系統的 0 與 1 比擬為生物體的 DNA 分子,那麼 ELF 就可比是細胞的架構一般:儘管有大小、形狀、功能之不同,仍有基本格式可尋。
ELF 檔究竟是什麼?網路上不難找到諸多詳實的資料,但筆者自己也常常苦於理解那些文件,總覺得,若是能有中文的內容,而且還附帶範例來讓人理解,那該是多麼方便啊!於是,想要理解 ELF 檔案格式的願望,也就成為了筆者參與本屆鐵人賽的原動力,希望在圓夢之餘,也能夠分享給需要的網友一同勉勵切磋。
為了避免缺乏新意的老調重彈,筆者還在這個主題中摻入自己想要學習的部分:GO 語言與 RISC-V 開放指令集架構。
GO 是一個靜態型別的編譯式語言,它的內建功能短小精悍,是 Docker 及 Kubernetes 等大型專案的原生開發語言,至今累積了許多的用戶、開發者與愛好者社群。在官方函式庫中,也有 ELF 相關的方法,因此作為這個主題的主力語言應是十分合適。
RISC-V 是一個方興未艾的指令集架構。不像 x86 或 ARM 這類已經在市場上橫行多年的 ISA 巨獸,RISC-V 的指令集相當簡潔,甚至可以被完全包含在一張不足 A4 大小的紙卡上;這份精簡的特性,應該有助於減輕讀者閱讀組合語言時的吃力程度。由於筆者私人興趣以及在工作上的需求,未來也會培養與 RISC-V ISA 相當程度的默契吧。
關於標題中最後的一個英文字 binutils,則是多年以來人們處理與理解 ELF 檔的工具包集合體,是自由軟體基金會的 GNU 專案的一部分。裏面包含了人盡皆知的 ld 連結器以及 as 組譯器,也有一些像是 nm、ranlib 等乍看之下不知是什麼的工具。這些工具幫助人們免於處理二進位格式的困頓,從而在每一個專案之中都直接或間接的加速並輔助了軟體的建置、除錯與監控的方便性。
這開宗明義的第一篇文章的後面兩個章節,筆者先提出鐵人賽計畫的總體目標與相關說明,日後也將視情況更新後續文章的目錄索引於本節之中;最後章節提供參考資料的連結,並將在過程中不斷更新。感謝 IT 邦幫忙再度主持這個利己利人的年度盛會,也歡迎各位讀者一同就相關的主題討論,當然還有所有形式的建議與批評。
為了讓有興趣的讀者諸君能夠一同體會這個主題的樂趣,筆者提供了這個 repo:RISC-V Playground from Scratch,也就是從零開始建置 RISC-V 的開發環境。今天我們先介紹這個 repo 的懶人版使用方法,明天再理解其中的過程為何。
首先我們要準備 docker 工具的安裝。Docker 是一個功能強大的工具,即使年初 Docker 公司已經宣佈將之併入 moby 母專案,多數 Linux 發行版也沒有改變軟體包的名稱,可以直接使用發行版的安裝方式。使用者也可以選擇加入官方的軟體包 Repo 作為上游,安裝 docker-ce 的免費社群版本。
筆者發現某些發行版似乎沒有更新舊有的 docker,因此像是 CentOS 或 Ubuntu 的用戶,最好依照官方教學進行安裝。
筆者也很高興慣用的 Archlinux 直接讓 docker 軟體包成為後來的 docker-ce 的別名。
Windows 或 Mac 的朋友也請不要氣餒,可至官方網站確認 docker-machine 的安裝方式。
一旦安裝好 docker 以及一般用的開發軟體包(最主要是 Makefile)之後,就可以使用 git,
$ git clone https://github.com/NonerKao/inception
$ cd inception
進入目錄之後,簡單的兩道指令即可完成環境建置:
$ make bootstrap
$ make update
然而,這個過程可能會花去非常久的時間以及 20G 以上的空間,請各位讀者耐心等候,先理解建置 RISC-V 軟體環境的過程中,筆者經過了哪些步驟。
make update
可以用來追上官方的新更動,而不需要耗費太多的時間在 git clone 上面。隔一段時間沒使用之後都可以make update
一下。
之後若要做一次性的模擬,可以用
$ make sim
若是需要一個持續的開發環境,這套 script 也提供類似虛擬機器的使用方式。第一次必須使用:
$ make run
確定開機之後就可以連線
$ make ssh
不需要之後可以關掉
$ make off
若要儲存修改,必須額外指定
$ make commit
其實這是 Docker container 環境,只是用起來像虛擬機器。
這個環境是 Archlinux 的環境,所使用的軟體管理工具是 pacman。
不想要使用 docker 或是 Arch 的讀者,請參考明天的完整解析內容,將會包含一步一腳印的教學與說明,也可以由各位讀者自行選擇喜歡的開發環境。
您好,我想按照您的方式建立環境(我想在win10上做可以嗎?),
我安裝完docker後,您所說的"一般用的開發軟體包"是什麼意思?
還有,git是指git bash嗎?所以下面這些$的語句都是在git bash上面執行嗎?
Hi,
另外,時隔三年,本文使用的環境架設方式已經過時,你可能需要從其他管道下手。我建議先跳過從源碼建置(build from scratch)的過程,先試著直接取得已經編好的環境如何呢?如 Fedora 的指令教學:https://fedoraproject.org/wiki/Architectures/RISC-V/Installing
如果有用Fedora 的指令教學:https://fedoraproject.org/wiki/Architectures/RISC-V/Installing
的朋友,有遇到以下問題的話
"[3973.3] Resizing (using virt-resize) to expand the disk to 20.0G
virt-resize: error: libguestfs error: "
可以嘗試看看=>sfdisk去改寫type
參考這篇https://bugzilla.redhat.com/show_bug.cgi?id=1248115#c6
(不過我後來是用手動下載然後安裝)