Big Endian 與他們的現狀 === 還記得大一上學期的計算機概論課堂上,老師提到記憶體架構時,講到 word (字組)時不免都會提到的 Big/Little endian 記憶體架構 不過之後就算是寫程式作業其實也不太會用到這方面的知識,一部份是因為作業環境大多都是 x86_64 環境下,就連我們的手機上的 ARM 也有 little-endian 版本的架構,這讓我不禁開始懷疑 ### 「Big endian 還活著嗎? 還是它已經跟南北橋一樣變成歷史名詞了呢?」  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
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.