more: Jollen 的 Embedded Linux 教育訓練

« OpenMoko 的 gsmd:Linux 手機的 GSM Modem 通訊程式 | Home | 小聊 .dynstr 節區 »

ELF 之 Program Loading 教學文件, #1: Segment 的觀念

jollen 發表於 March 5, 2007 12:05 PM

「Program Loading」的議題在討論「如何將程式載入記憶體」,以便後續的「執行」。在「ELF(Executable and Linking Format)格式教學文件」第 1~8 篇文章裡,我們了解基本的 ELF 觀念,並建立所謂的「節區」知識。

本系列日記「ELF 之 Program Loading 教學文件」將會介紹有關程式載入(program loading)的核心主題,在此之前,請先閱讀 Jollen 的「Executable and Linking Format」專欄,以基本基礎的先備知識。

Segments

由 "execution view" 的角度來看程式(即 process),所謂的節區(section)已經被進化成區段(segment)的觀念了。廣義來說,section 可被分為以下 3 種 segment:

  • Text segment - 指存放唯讀(read-only)程式碼與資料的所有 section 。
  • Data segment - 指存放可寫(writable data)程式碼與資料的所有 section。
  • BSS segment - 即 .bss section。

另外,還有一類的 segment:

  • Dynamic segment - 用來存放 dynamic linking 資訊的 section。

不過,當我們講到「process segment」時,指的是 text segment、data segment 與 BSS segment;process address space 就是由這三種 segment 所構成。

Text segment 是由以下的 section 組成:

  • .text
  • .rodata
  • .hash
  • .dynsym
  • .dynstr
  • .plt
  • .rel.got

Data segment 是由以下的 section 組成:

  • .data
  • .dynamic
  • .got
  • .bss

依照 SystemV ABI 規格,我們看到 .bss section 被放到 data segment 裡,但嚴格來說,我們應把 .bss section 另外獨立出來討論。基本的 .bss section 觀念,可參考 Jollen 的「BSS Section Concepts」專欄。

此外,在 text segment 與 data segment 裡,包含了 4 個與 dynamic linking 有關的 section,整理如下圖。

dynamic_linking_sections.JPG

與 dynamic linking 有關的 4 個 section 並非另外組成所謂的 dynamic segment,這只是我們在研究 dynamic linking 時邏輯上的用語。

到這裡,我們了解了一個相當重要的一個觀念:當程式載入後,是以 "segment" 的觀念存在於記憶體中,並且也是以 segment 的觀念被 Linux kernel 管理。ELF 執行檔被載入到記憶體的過程中,最重要的資訊就是前導專欄裡所提到的「Program Header Table」;就 ELF execution view 來說,program header table 是必要的,下篇日記會針對此議題做介紹。

--jollen

引用通告

如果您想引用這篇文章到您的Blog,
請複製下面的鏈接,並放置到您發表文章的相應界面中。

http://blog.jollen.org/mt-tb.cgi/356

發表一個評論

(您發表的意見將被立即接受,但需要一點時間與後端伺服器做同步,您的留言才會顯示在網站上。為避免 spam 攻撃,按「發表」後請輸入帳號密碼。使用者帳號:「nospam」、密碼:「nospam」。)

Top | 授權條款 | Jollen's Forum: Blog 評論、討論與搜尋
Copyright(c) 2006 www.jollen.org