還記得大一上學期的計算機概論課堂上,老師提到記憶體架構時,講到 word (字組)時不免都會提到的 Big/Little endian 記憶體架構
不過之後就算是寫程式作業其實也不太會用到這方面的知識,一部份是因為作業環境大多都是 x86_64 環境下,就連我們的手機上的 ARM 也有 little-endian 版本的架構,這讓我不禁開始懷疑
Hacker's News 上面在今年初有這樣的一串討論 Ask HN: Is big-endian dead?
提問人主要觀點跟我觀察到的蠻相近的,
請問目前還有在嵌入式市場(或其他特定市場)實際生產的 big-endian 晶片嗎?
甚至連 MIPS 與 Power PC 現在也開始支援 little-endian 模式,就連 ARM 目前也近乎只生產 little-endian 的晶片,而 RISC-V 這樣新出現的架構也採用 little-endian 模式
但是第一個回覆以我完全沒想過的角度對現今 big-endian 的使用做出了解釋
只要我們還在使用傳統的網路傳輸架構,那麼 big-endian 就不算是真正死亡;畢竟,網路傳輸絕大多數還是使用 "big-endian" 的
Big-endian 因為在 serialize 資料輸入時更為方便,因此在網路應用裡更加常見 …
隨後的討論中也有提到「網路封包 Big-endian 傳輸」與「Little-endian 主流 CPU 架構」下的轉換成本問題,似乎目前金融方面的應用已經捨棄在網路傳輸端使用 Big-endian 以減少轉換成本
主要都是嵌入式系統相關,像是 Broadcom 家的 DSP 或是影音處理相關的(跟網路傳輸大多用 Big-endian 同理)
Power PC 是 IBM 設計的一款精簡指令集(RISC)架構,當初是AIM聯盟(Apple + IBM + Motorola)發展的架構
相關應用的產品有 Apple Mac(不過 Mac 在 2005 之後改用 Intel 家的 CPU),微軟家的 Xbox 360 (2005 ~ 2016),任天堂的 Wii (2006 ~ 2017),索尼的 PlayStation 3 (2006 ~ 2017)
不過可以看到上述知名產品到現今已經不採用 Power PC 架構,這可能也是 QEMU 這樣的虛擬機對 PowerPC 的支援生態系發展緩慢的原因
沒有錯,就是大家計算機概論/ 計算機組織提到組合語言最喜歡被拿來當例子的 MIPS,MIPS 最開始是 Big-endian 設計,不過現今有 MIPSEL 也就是 MIPS 的 little-endian 版本(MIPS-EL 後面的 EL 正好是 Little Endian 的 little-endian 排列)
MIPS 相關的新聞從 2011 年 DIGITimes <多線緒行動處理器調變技術與應用> 強調其處理多執行緒能力到最近 2018 EE Times <MIPS Is Back, With An Eye on AI> 正面的評論,不過文章中不免提到現今市場大多被 Intel 與 Arm 瓜分(MIPS之路在何方?)
如果今天你需要針對不同 endian 架構設計一個泛用的功能,你要怎麼測試這樣的通用性呢?
你需要一台虛擬機器幫你作測試
網路上還是有文章教導怎麼模擬 big-endian 機器,不過不少文章都有點過時而且很難用
模仿/模拟C中的大端行为?事實上這篇文章只是簡單講一下 Debian Squeeze and Wheezy mips images for QEMU 裡面檔案怎麼用,裡面就是 qcow2 映像檔跟 debian 的 kernel image,不過沒有自己 boot 有點黑箱一開始並沒有打算用這個
用法非常簡單,只需要
在 Linux 系統裡,你可以在 /boot
裡面看到 vmlinuz-[版本號]-generic
等類似的 kernel 函式庫軟連結(4.4.0-53 大概是 7M 大小)
Debian on an emulated MIPS(EL) machine 這篇文章提到怎麼「初始化映像檔,boot with OS iso 與 kernel image」,是非常誘人的,不過不知道為什麼在安裝 debian 時,在找 local mirror 時,要不是沒有提供對應的映像檔,不然就是載了下來發現格式不合(然後映像檔很大我一度以為虛擬機當掉沒反應)
QEMU 對於 Power PC 模擬的相關文件,Power PC 也是主要 Big-endian 的一份子,不過 QEMU 文件提到的安裝方法都要用到 yaboot
裝 kernel image,關於 yaboot
我在網路上找到的說明大多偏向實體機安裝,虛擬機的相對路徑很明顯應該是不一樣的
雖然現在主流的系統絕大多數都是 little-endian,不過還是有辦法偵測 endian
如果是在 Linux 系統,可以使用 shell script 判斷
如果是 little endian 則應該會回傳 1,如果是 big endian 則應該會回傳 0