Try   HackMD

Big Endian 與他們的現狀

還記得大一上學期的計算機概論課堂上,老師提到記憶體架構時,講到 word (字組)時不免都會提到的 Big/Little endian 記憶體架構

不過之後就算是寫程式作業其實也不太會用到這方面的知識,一部份是因為作業環境大多都是 x86_64 環境下,就連我們的手機上的 ARM 也有 little-endian 版本的架構,這讓我不禁開始懷疑

「Big 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 以減少轉換成本

還有哪些現存晶片還願意擁抱 Big-endian 呢?

主要都是嵌入式系統相關,像是 Broadcom 家的 DSP 或是影音處理相關的(跟網路傳輸大多用 Big-endian 同理)

Power PC

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,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之路在何方?

要怎麼模擬 Big-endian machine?

如果今天你需要針對不同 endian 架構設計一個泛用的功能,你要怎麼測試這樣的通用性呢?

你需要一台虛擬機器幫你作測試

網路上還是有文章教導怎麼模擬 big-endian 機器,不過不少文章都有點過時而且很難用

模仿/模拟C中的大端行为?事實上這篇文章只是簡單講一下 Debian Squeeze and Wheezy mips images for QEMU 裡面檔案怎麼用,裡面就是 qcow2 映像檔跟 debian 的 kernel image,不過沒有自己 boot 有點黑箱一開始並沒有打算用這個

用法非常簡單,只需要

  1. qemu-img 建立適當大小的虛擬硬碟
  2. qemu-system-mips 執行載下來的 qcow2 映像檔與 qemu kernel image 還要附上虛擬硬碟位置

什麼是 vmlinux ?

在 Linux 系統裡,你可以在 /boot 裡面看到 vmlinuz-[版本號]-generic 等類似的 kernel 函式庫軟連結(4.4.0-53 大概是 7M 大小)

為什麼改變 big/little endian 需要也跟著改 kernel

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/Big - endian ?

雖然現在主流的系統絕大多數都是 little-endian,不過還是有辦法偵測 endian

如果是在 Linux 系統,可以使用 shell script 判斷

echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6

如果是 little endian 則應該會回傳 1,如果是 big endian 則應該會回傳 0