在前一篇文章中,我們認識了 GNU 間接函式(GNU indirect function)的運作機制,然而,正如在那篇文章中說過的,使用 GNU 間接函式必須在實作解析器函式時注意許多細節,增加了使用上的難度。不過,如果只是要替特定硬體提供更快速的實作,GCC 提供了一個更方便的方法(目前只支援 x86)——函式多版本化(function multiversioning),也就是這篇文章所要介紹的。
2017年4月23日 星期日
2017年4月15日 星期六
GNU indirect function 的運作機制
有時候為了提高程式的效能,對於同一個函式,根據執行時的環境,我們在實作上可能會有兩種以上的選擇,在傳統的方法中,我們可能會選擇使用函式指標來做這件事,然而,管理這些函式指標通常相當麻煩,尤其是當這個函式還要提供給其他函式庫使用的時候。但在 GNU/Linux 上,我們可以在某些情況,使用另一個更方便的方法——GNU 間接函式(GNU indirect function)。
此外,GNU 間接函式也是 GCC 的函式多版本化(function multiversioning)機制的實作基礎,如果想要了解函式多版本化的運作方式,提前弄清楚 GNU 間接函式也是必要的。
在本文中,會以 x86-64 為例,解釋 GNU 間接函式的運作機制。
2017年4月3日 星期一
什麼是 Linux vDSO 與 vsyscall?——發展過程
在現今的 x86 Linux 上,無論 32 位元還是 64 位元系統,我們都可以找到 vDSO 或 vsyscall 的蹤跡,然而,在網路上卻很難找到仔細討論的文章,有時候,即便找到了一些以前的文章,在對照現今的 Linux 核心原始碼時,總會覺得這樣或那樣的似是而非,因此,我決定追溯歷史,弄清楚這些差異源自哪裡。
2017年3月17日 星期五
[翻譯] 認識 x64 程式碼模型(code model)
- 原文標題:Understanding the x64 code models
- 原文網址:http://eli.thegreenplace.net/2012/01/03/understanding-the-x64-code-models
- 原文作者:Eli Bendersky
- 原文發表時間:2012 年 01 月 03 日
- 譯註:
- 文中的反組譯內容使用的是 AT&T 格式的組合語言語法。
- 關於「code model」的正體中文翻譯,有程式碼模型、程式碼模式、編碼式樣等,在本文中,一律採取「程式碼模型」。
↓↓↓↓↓↓ 正文開始 ↓↓↓↓↓↓
在撰寫用於 x64 架構程式碼的時候,一個會出現的有趣議題是要使用哪個程式碼模型(code model),儘管這可能不是一個廣為人知的主題,但如果有人想要理解編譯器所產生的 x64 機器碼,則熟悉程式碼模型就有了教育意義;而對於那些真的很在乎效能,直到每個細小指令的人來說,該主題對最佳化(optimization)也會有影響。
2017年3月7日 星期二
[翻譯] x64 上共享函式庫裡的位址無關程式碼(PIC)
- 原文標題:Position Independent Code (PIC) in shared libraries on x64
- 原文網址:http://eli.thegreenplace.net/2011/11/11/position-independent-code-pic-in-shared-libraries-on-x64
- 原文作者:Eli Bendersky
- 原文發表時間:2011 年 11 月 11 日
↓↓↓↓↓↓ 正文開始 ↓↓↓↓↓↓
前篇文章解釋了位址無關程式碼(position independent code,PIC)是如何運作的,並以 x86 架構下編譯的程式碼作為範例,我承諾過會在一篇分開的文章中涵蓋 x64〔1〕上的 PIC,所以我們才會在這裡。本文討論的細節會少很多,因為它假定對 PIC 理論上如何運作早已了解,一般來說,用於這兩個平台的構想是很相似的,只不過由於各個架構的獨特特性,所以某些細節會有差異。
2015年3月12日 星期四
[翻譯] 系統呼叫(system call)的剖析(下)
- 原文標題:Anatomy of a system call, part 2
- 原文網址:http://lwn.net/Articles/604515/
- 原文作者:David Drysdale
- 原文發表時間:2014 年 07 月 16 日
譯註:
- 本文內容與圖片皆自原網址修改。
- 根據原文使用的參考資料連結,原文應該是使用 3.14 版核心做為依據。
↓↓↓↓↓↓ 正文開始 ↓↓↓↓↓↓
上一篇文章探索了系統呼叫(system call,或 syscall)的核心實作最平凡的形式:一個一般的系統呼叫、並在一個最普遍的架構上:x86_64。現在,用這個基本主軸的一些變體,含括了其他 x86 架構和其他系統呼叫機制,來完結我們在這方面的關注。我們要從探索各種 32 位元 x86 架構的變種開始,一張相關牽涉範圍的地圖也許對此有所幫助,這張地圖在檔案名稱和箭頭線段標籤上,都是可以點擊然後連結到被參考程式碼的:
2015年2月24日 星期二
[翻譯] 系統呼叫(system call)的剖析(上)
- 原文標題:Anatomy of a system call, part 1
- 原文網址:http://lwn.net/Articles/604287/
- 原文作者:David Drysdale
- 原文發表時間:2014 年 07 月 09 日
譯註:
- 本文內容與圖片皆自原網址修改。
- 根據原文使用的參考資料連結,原文應該是使用 3.14 版核心做為依據。
↓↓↓↓↓↓ 正文開始 ↓↓↓↓↓↓
系統呼叫是使用者空間(user-space)下的程式與 Linux 核心互動的主要機制,既然它們這麼重要,那麼我們一點都不奇怪能夠發現核心引入各式各樣的機制,來確保系統呼叫能跨架構做一般性的實作,並能以一種既有效率,又有一致性的方法讓使用者空間可以使用。