ELF程序頭部及程序加載


程序頭部

程序頭部描述與程序執行直接相關的目標文件結構信息。用來在文件中定位各個段的映像。同時包含其他一些用來為程序創建進程映像所必需的信息。

可執行文件或者共享目標文件的程序頭部是一個結構數組,每個結構描述了一個段或者系統准備程序執行所必需的其它信息。

目標文件的“段”包含一個或者多個“節區”, 也就是“段內容(Segment Contents)”。

程序頭部僅對於可執行文件和共享目標文件有意義。

程序頭部的數據結構如下

其中各個字段說明如下:

  •  p_type 此數組元素描述的段的類型。
  • p_offset 此成員給出從文件頭到該段第一個字節的偏移。
  • p_vaddr 此成員給出段的第一個字節將被放到內存中的虛擬地址。
  • p_paddr 此成員僅用於與物理地址相關的系統中。
  • p_filesz 此成員給出段在文件映像中所占的字節數。可以為 0。
  • p_memsz 此成員給出段在內存映像中占用的字節數。可以為 0。
  • p_flags 此成員給出與段相關的標志。
  • p_align 此成員給出段在文件中和內存中如何對齊。數值 0 和 1 表示不需要對齊。 

段類型如下:

  • PT_NULL 0 此數組元素未用。
  • PT_LOAD 此數組元素給出一個可加載的段,段的大小由 p_filesz 和 p_memsz 描述。
  • PT_DYNAMIC 數組元素給出動態鏈接信息。
  • PT_INTERP 數組元素給出一個 NULL 結尾的字符串的位置和長度,該字符串將被當作解釋器調用。
  • PT_NOTE 此數組元素給出附加信息的位置和大小。
  • PT_SHLIB 此段類型被保留。
  • PT_PHDR 此類型的數組元素如果存在,則給出了程序頭部表自身的大小和位置,既包括在文件中也包括在內存中的信息。
  • PT_LOPROC 0x70000000 PT_HIPROC 0x7fffffff 此范圍的類型保留給處理器專用語義

程序加載:

給定一個目標文件,系統加載該文件到內存中,啟動程序執行。

進程除非在執行過程中引用到相應的邏輯頁面,否則不會請求真正的物理頁面。

進程通常會包含很多未引用的頁面,因此延遲物理讀操作通常會避免這類費力不討好的事情發生,從而提高系統性能。

要想實際獲得這種效率,可執行文件和共享目標文件必須具有這樣的段:其文件偏移和虛擬地址對頁面大小取模后余數相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM