【问题标题】:Why the virtual address of ELF can be determined before it is mapped to virtual space?为什么ELF的虚拟地址在映射到虚拟空间之前就可以确定?
【发布时间】:2015-12-30 06:14:05
【问题描述】:

链接目标文件以生成 ELF 文件并确定其虚拟地址。例如,.text 的虚拟地址是 0x8048000。当 ELF 文件要映射到虚拟空间时,另一个 ELF 已经映射到该地址。 操作系统应该做什么? 为什么ELF的虚拟地址在映射到虚拟空间之前就可以确定。

【问题讨论】:

  • 因为可执行文件的地址是确定的。

标签: linux linux-kernel operating-system elf


【解决方案1】:
  1. ELF 告诉 Linux 内核它想要放置的位置,如果 Linux 内核接受该地址,它会将其加载到那里。

    例如0 无效,因为太低:Why is the ELF execution entry point virtual address of the form 0x80xxxxx and not zero 0x0?

    ld 使用配置为使用的链接描述文件确定地址:In an ELF file, how does the address for _start get detemined?

  2. 正如 Wyzard 所说,每个进程都有自己的虚拟地址空间。

    更准确地说,虚拟地址空间通过分页具有硬件支持:内核设置和使用的How does x86 paging work?

【讨论】:

    【解决方案2】:

    每个进程都有自己的私有虚拟地址空间——这就是它是虚拟的意义所在;它不必与程序实际位于物理 RAM 中的位置相对应。所以在不同进程中运行的程序之间没有地址冲突。它们可以全部映射到该地址,每个都在自己的私有地址空间中。

    【讨论】:

    • 但问题不在于不同的进程——而是关于映射在同一个进程中的不同共享对象。
    • @el.pescado 这个问题没有提到共享库。但是,这些应该是可重定位的,因此地址在那里也不重要。
    • 谢谢!我误解了一些概念,我已经说清楚了。每个进程都有自己的虚拟地址空间。每个过程都是独立的。坦克!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2012-02-18
    • 2021-09-11
    • 2021-03-18
    相关资源
    最近更新 更多