Big Endian 與他們的現狀 === 還記得大一上學期的計算機概論課堂上,老師提到記憶體架構時,講到 word (字組)時不免都會提到的 Big/Little endian 記憶體架構 不過之後就算是寫程式作業其實也不太會用到這方面的知識,一部份是因為作業環境大多都是 x86_64 環境下,就連我們的手機上的 ARM 也有 little-endian 版本的架構,這讓我不禁開始懷疑 ### 「Big endian 還活著嗎? 還是它已經跟南北橋一樣變成歷史名詞了呢?」 ![](https://i.imgur.com/GJgGngU.png) Hacker's News 上面在今年初有這樣的一串討論 [Ask HN: Is big-endian dead?](https://news.ycombinator.com/item?id=16187939) 提問人主要觀點跟我觀察到的蠻相近的, > 請問目前還有在嵌入式市場(或其他特定市場)實際生產的 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)發展的架構 相關應用的[產品](https://en.wikipedia.org/wiki/PowerPC_applications)有 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 正好是 **L**ittle **E**ndian 的 little-endian 排列) MIPS 相關的新聞從 2011 年 DIGITimes [<多線緒行動處理器調變技術與應用>](https://www.digitimes.com.tw/iot/article.asp?cat=130&id=0000229401_4l0336if1rm2bo0ea8fwq) 強調其處理多執行緒能力到最近 2018 EE Times [<MIPS Is Back, With An Eye on AI>](https://www.eetimes.com/document.asp?doc_id=1332858) 正面的評論,不過文章中不免提到現今市場大多被 Intel 與 Arm 瓜分([MIPS之路在何方?](https://www.eettaiwan.com/news/article/20170929NT01-MIPS-Underdog-or-Dead-Horse)) ### 要怎麼模擬 Big-endian machine? 如果今天你需要針對不同 endian 架構設計一個泛用的功能,你要怎麼測試這樣的通用性呢? 你需要一台虛擬機器幫你作測試 網路上還是有文章教導怎麼模擬 big-endian 機器,不過不少文章都有點過時而且很難用 [模仿/模拟C中的大端行为?](https://codeday.me/bug/20181011/304698.html?fbclid=IwAR0jnVQIdFwqlSpUMnWRvVFgFCut0RN5ZS2w-rHYuUH0SLykAtyYEleMjrg)事實上這篇文章只是簡單講一下 [Debian Squeeze and Wheezy mips images for QEMU](https://people.debian.org/~aurel32/qemu/mips/) 裡面檔案怎麼用,裡面就是 qcow2 映像檔跟 debian 的 kernel image,不過沒有自己 boot 有點黑箱一開始並沒有打算用這個 用法非常簡單,只需要 1. qemu-img 建立適當大小的虛擬硬碟 2. qemu-system-mips 執行載下來的 qcow2 映像檔與 qemu kernel image 還要附上虛擬硬碟位置 :::info ### 什麼是 vmlinux ? 在 Linux 系統裡,你可以在 `/boot` 裡面看到 `vmlinuz-[版本號]-generic` 等類似的 kernel 函式庫軟連結(4.4.0-53 大概是 7M 大小) ::: :::info ### 為什麼改變 big/little endian 需要也跟著改 kernel ::: [Debian on an emulated MIPS(EL) machine](https://www.aurel32.net/info/debian_mips_qemu.php?fbclid=IwAR3Balrtdjsb1F3iv8kqwT4VXgpX1SxWoojmnNXXUoUpg2sAy1dfH-2cdms) 這篇文章提到怎麼「初始化映像檔,boot with OS iso 與 kernel image」,是非常誘人的,不過不知道為什麼在安裝 debian 時,在找 local mirror 時,要不是沒有提供對應的映像檔,不然就是載了下來發現格式不合(然後映像檔很大我一度以為虛擬機當掉沒反應) [QEMU 對於 Power PC 模擬的相關文件](https://wiki.qemu.org/Documentation/Platforms/PowerPC),Power PC 也是主要 Big-endian 的一份子,不過 QEMU 文件提到的安裝方法都要用到 `yaboot` 裝 kernel image,關於 `yaboot` 我在網路上找到的說明大多偏向實體機安裝,虛擬機的相對路徑很明顯應該是不一樣的 ### 要怎麼知道電腦是 Little/Big - endian ? 雖然現在主流的系統絕大多數都是 little-endian,不過還是有辦法偵測 endian 如果是在 Linux 系統,可以使用 shell script 判斷 ```bash echo -n I | od -to2 | head -n1 | cut -f2 -d" " | cut -c6 ``` 如果是 little endian 則應該會回傳 1,如果是 big endian 則應該會回傳 0