程序頭部
程序頭部描述與程序執行直接相關的目標文件結構信息。用來在文件中定位各個段的映像。同時包含其他一些用來為程序創建進程映像所必需的信息。
可執行文件或者共享目標文件的程序頭部是一個結構數組,每個結構描述了一個段或者系統准備程序執行所必需的其它信息。
目標文件的“段”包含一個或者多個“節區”, 也就是“段內容(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 此范圍的類型保留給處理器專用語義
程序加載:
給定一個目標文件,系統加載該文件到內存中,啟動程序執行。
進程除非在執行過程中引用到相應的邏輯頁面,否則不會請求真正的物理頁面。
進程通常會包含很多未引用的頁面,因此延遲物理讀操作通常會避免這類費力不討好的事情發生,從而提高系統性能。
要想實際獲得這種效率,可執行文件和共享目標文件必須具有這樣的段:其文件偏移和虛擬地址對頁面大小取模后余數相同。