程序头部
程序头部描述与程序执行直接相关的目标文件结构信息。用来在文件中定位各个段的映像。同时包含其他一些用来为程序创建进程映像所必需的信息。
可执行文件或者共享目标文件的程序头部是一个结构数组,每个结构描述了一个段或者系统准备程序执行所必需的其它信息。
目标文件的“段”包含一个或者多个“节区”, 也就是“段内容(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 此范围的类型保留给处理器专用语义
程序加载:
给定一个目标文件,系统加载该文件到内存中,启动程序执行。
进程除非在执行过程中引用到相应的逻辑页面,否则不会请求真正的物理页面。
进程通常会包含很多未引用的页面,因此延迟物理读操作通常会避免这类费力不讨好的事情发生,从而提高系统性能。
要想实际获得这种效率,可执行文件和共享目标文件必须具有这样的段:其文件偏移和虚拟地址对页面大小取模后余数相同。