• 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 此范围的类型保留给处理器专用语义

    程序加载:

    给定一个目标文件,系统加载该文件到内存中,启动程序执行。

    进程除非在执行过程中引用到相应的逻辑页面,否则不会请求真正的物理页面。

    进程通常会包含很多未引用的页面,因此延迟物理读操作通常会避免这类费力不讨好的事情发生,从而提高系统性能。

    要想实际获得这种效率,可执行文件和共享目标文件必须具有这样的段:其文件偏移和虚拟地址对页面大小取模后余数相同。

  • 相关阅读:
    Hibernate:组合模式解决树的映射
    以面到点的学习MFC
    linux内核--进程与线程
    控件自定义
    火车车次查询-余票查询--Api接口
    如何处理大量数据并发操作(数据库锁机制详解)
    Java单链表、双端链表、有序链表实现
    事务、数据库事务、事务隔离级别、锁的简单总结
    数据库连接池分析
    Spring面试题集
  • 原文地址:https://www.cnblogs.com/tongyishu/p/11821645.html
Copyright © 2020-2023  润新知