2015-10-02 76 views
4

鏈接目標文件以生成ELF文件並確定其虛擬地址。例如,.text的虛擬地址是0x8048000。當ELF文件將被映射到虛擬空間時,另一個ELF文件已經被映射到這個地址。 操作系統應該做什麼? 爲什麼在映射到虛擬空間之前可以確定ELF的虛擬地址。爲什麼在映射到虛擬空間之前可以確定ELF的虛擬地址?

+0

因爲可執行文件的地址已確定。 – Jichao

回答

3

每個進程都有它自己的私有虛擬地址空間 - 這就是它的虛擬點;它不必與程序實際位於物理RAM中的位置相對應。所以在不同進程中運行的程序之間沒有地址衝突。他們可以將全部映射到該地址,每個地址都在其自己的專用地址空間中。

+0

但問題不是關於不同的進程 - 而是關於不同的共享對象在**相同的進程**中映射的。 –

+0

@ el.pescado問題沒有提到共享庫。但是,這些應該是可重新定位的,因此地址在那裏也不重要。 –

+0

謝謝!我誤解了一些概念,並且已經說清楚了。每個進程都有其虛擬地址空間。每個過程都是獨立的。 Tnanks! – haolee

0
  1. ELF告訴Linux內核它要放置的位置,如果Linux內核接受該地址,它會將其加載到那裏。

    E.g. 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?內核設置和使用。