ISA 記憶體模型
ISA 記憶體模型是架構向軟體承諾的那幅記憶體圖像。對程式而言,記憶體看起來像一整排巨大的編號信箱,每個裝著一小塊資料,而這個模型把這排信箱的規則寫清楚:信箱怎麼編號、每個多大、跨多個信箱的值如何排列、哪些存取合法。真正的實體記憶體(快取、DRAM 晶片、全部)都被隱藏;軟體看到的是這個乾淨、理想化的陣列。
三條規則讓它具體起來。第一,位元組定址:記憶體一次以一個位元組(8 位元)定址,所以每個位址挑出一個獨立的位元組,而一個 32 位元的位址空間能命名 2^32 個位元組。第二,對齊:一個多位元組值,例如一個 4 位元組的字組,通常被期望從一個是其大小倍數的位址開始(字組落在能被 4 整除的位址);未對齊的存取可能很慢,或在某些機器上根本不合法。第三,端序:當一個多位元組數字跨數個位元組位址儲存時,模型固定其順序——小端把最低有效位元組放在最低位址,大端則把最高有效位元組放在最前——而軟體必須與硬體就採用哪一種達成一致。
這個模型之所以重要,是因為它正是程式設計師或編譯器為了得到正確結果、以及在機器間交換資料時必須遵守的那部分契約。例如端序,在你於一台機器上存下位元組、再到另一台採相反順序的機器上讀取之前,它都是不可見的——然後那個數字就會讀出來亂掉。一個重要的澄清:這個軟體可見的模型,與多處理器的「記憶體一致性模型」不是同一回事;後者管的是更棘手的問題:一個核心的寫入以什麼順序對另一個核心變得可見;那是另一個更深入的主題。
把 32 位元數字 0x01020304 存到位址 0x100。在小端機器上,位元組落為 0x100=0x04、0x101=0x03、0x102=0x02、0x103=0x01(最低有效位元組在前);大端機器則把這個順序顛倒。
同樣的數字、同樣的位址,但端序決定哪個位元組落在哪。
ISA 的位元組定址模型是一個軟體可見的抽象,與多處理器的記憶體一致性模型(寫入跨核心變得可見的順序)是兩回事。別把「記憶體如何定址」和「並行寫入如何排序」搞混。