April 23, 2006

理解 64-bit Programming Model

話說去年 zonble 寫了 [Long Long Long is Too Long],一開始 mjhsieh 測試 long long (依據 C Standard,至少要有 64 bit 的資料寬度) 的「加強版」,也就是 "long long long",結果 GCC 很雞婆的抱怨 "too long",後來大夥竟然認真演繹其中的哲理。不過,邁入 64-bit 的新紀元,的確有很多思維必須轉換,首先我們會遇到的問題就是 Programming Model,IBM alphaWorks 的 [Porting Linux applications to 64-bit systems] 是一篇很好的入門文章。

就 IA32 來說,4G 的記憶體定址就是受限於 32-bit Model,甚至還可能面臨經典的 [Year 2038 Problem] 。64-bit Programming Model 到底有什麼優點呢?在提及細節前,先來看個希臘拉丁字首:Exa-(E-),也就是 2 的 60 次方,在 64-bit 架構下,應用程式可直接存取 16 Exabytes 的 RAM Addressing,而 Linux kernel 到目前為止支援到 64 Gb 的定址,詳情可參考 Wikipedia [64-bit]。

在 system bus 的 data access 來說,IA32 或類似的架構,其實已經因應 SIMD 的需求,提出 64-bit 或 128-bit 的 register,比方說 MMX、MMX2(ext)、SSE,或者 Wireless MMX。[Porting Linux applications to 64-bit systems] 提到三種 64-bit Programming Model:LP64、LLP64,以及ILP64,對有看台灣新聞的朋友來說,這幾個名稱實在很容易記憶 *笑*。

L 表示 Long、LL 表示 long long,而 I 表示 Integer,LP64 則規範 Long 必須為 64-bit wide,其他 data type 則是較低的 data width,同理 LLP 就是說 long long 必須 64-bit wide。在另一篇文章 [64-Bit Programming Models: Why LP64?] 則提到為何 UNIX Open Standards 要採用 LP64 Programming Model,而 IBM 的文章則提到移植既有 32-bit 應用程式到 64-bit 架構需要注意的九項議題:
  • Declarations
  • Expressions
  • Assignments
  • Numeric constants
  • Endianism
  • Type definitions
  • Bit shifting
  • Formatting strings
  • Function parameters
其中,Assignment 很容易因為強制轉型造成潛在的問題,再來就是 Function parameters,這也可能因為混雜 32/64-bit 表示法而產生非預期的結果。
由 jserv 發表於 April 23, 2006 07:00 PM
迴響

多謝指引,竟然發現了zonble 之前blog了 本日金句:LongLong Long is Too Long」這篇妙文。我決定來個最佳翻譯徵求懸賞,共襄盛舉:

http://shelandy.blogspot.com/2007/10/gcc.html

shelandy 發表於 October 20, 2007 02:42 PM
發表迴響









記住我的資訊?