iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 1
4

總論


在諸多學門之中,資訊科學可說是相當年輕的一支,就算僅僅發展數十年,其不成比例的影響力仍然形塑今日人們的科技生活的所有面向。其中,許多觀念、理論、技術經過歲月的淘洗,成為內行不可不知、外行也常常略有耳聞的普及知識。這樣的例子俯拾皆是,比方說經典的 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 邦幫忙再度主持這個利己利人的年度盛會,也歡迎各位讀者一同就相關的主題討論,當然還有所有形式的建議與批評。

目標


  1. 讓新手也能入門的內容撰寫
    筆者撰寫本系列文章時將力求淺顯易懂,並輔佐以程式碼、指令操作以及必要的圖例,對於作業系統有基本認識的讀者應該都能駕輕就熟的理解。
  2. 使用 GO 語言開源實作 binutils 子集合 (2/3)
    筆者已經在 github 上開闢了一個名為 go-binutils 的專案,現在幾乎可以說是還沒有任何真正觸摸到 ELF 格式的內容。不過,隨著本系列的進度成長,這個專案也必然會增加原先 GNU binutils 工具包的子集合功能。筆者並希望能在未來繼續擴充這個專案,往內容的完整度與效能的強化為方向努力。這個階段預計會花去前 2/3 的篇幅,內容會包含原先工具程式的介紹、使用範例以及 GO 語言的改作,以及相關議題的探討。
  3. 專題實作 (1/3)
    這個部分筆者目前僅有一些備案,將在本系列的後半再提出,希望可以做一個與 ELF 相關的工具程式。

環境架設:懶人篇


為了讓有興趣的讀者諸君能夠一同體會這個主題的樂趣,筆者提供了這個 repoRISC-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 的讀者,請參考明天的完整解析內容,將會包含一步一腳印的教學與說明,也可以由各位讀者自行選擇喜歡的開發環境。

參考資料


  1. hello world 說明(英文)
  2. 維基百科的 ELF 格式說明
  3. 國內的一份系統程式教材
  4. RISCV 基金會的 ELF 文件

下一篇
第二日:環境架設及過程解析
系列文
與妖精共舞:在 RISC-V 架構上使用 GO 語言實作 binutils 工具包30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
sao851026
iT邦新手 5 級 ‧ 2020-08-05 11:40:47

您好,我想按照您的方式建立環境(我想在win10上做可以嗎?),
我安裝完docker後,您所說的"一般用的開發軟體包"是什麼意思?
還有,git是指git bash嗎?所以下面這些$的語句都是在git bash上面執行嗎?

高魁良 iT邦新手 2 級 ‧ 2020-08-06 10:15:12 檢舉

Hi,

  1. win10 是否能夠作為開發環境
    我不確定在win10裡面架設docker之後,是否能夠使用其他Linux系統的image。比較麻煩但一定可以用的方法就是使用VM先架設一個虛擬Linux主機,然後在裡面作本系列的實驗。
  2. 一般用的開發軟體包
    只是行文不想要過度中英交雜,原意對應到英文的General-purpose,也就是沒有特別針對什麼用途、普遍通用的開發工具。
  3. git bash
    我沒有使用過windows上的git bash。文中的$提示字元都是假設在Linux環境下的shell執行的。

另外,時隔三年,本文使用的環境架設方式已經過時,你可能需要從其他管道下手。我建議先跳過從源碼建置(build from scratch)的過程,先試著直接取得已經編好的環境如何呢?如 Fedora 的指令教學:https://fedoraproject.org/wiki/Architectures/RISC-V/Installing

Swark iT邦新手 5 級 ‧ 2020-10-22 00:33:57 檢舉

如果有用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
(不過我後來是用手動下載然後安裝)

我要留言

立即登入留言