0

這裏我在兩個不同的終端上運行兩個相同程序的實例。它們的過程地圖是流程圖上的問題

在第一終端 -

[email protected]:~$ pmap 6548 
6548: ./a.out 
0000000000400000  4K r-x-- /home/vikram/a.out 
0000000000600000  4K r---- /home/vikram/a.out 
0000000000601000  4K rw--- /home/vikram/a.out 
00007f90f2406000 1576K r-x-- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f90f2590000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f90f278f000  16K r---- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f90f2793000  4K rw--- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f90f2794000  24K rw--- [ anon ] 
00007f90f279a000 132K r-x-- /lib/x86_64-linux-gnu/ld-2.13.so 
00007f90f2992000  12K rw--- [ anon ] 
00007f90f29b7000  12K rw--- [ anon ] 
00007f90f29ba000  4K r---- /lib/x86_64-linux-gnu/ld-2.13.so 
00007f90f29bb000  8K rw--- /lib/x86_64-linux-gnu/ld-2.13.so 
00007fffb2333000 132K rw--- [ stack ] 
00007fffb23ff000  4K r-x-- [ anon ] 
ffffffffff600000  4K r-x-- [ anon ] 
total    3984K 

在第二終端 -

[email protected]:~$ pmap 6676 
6676: ./a.out 
0000000000400000  4K r-x-- /home/vikram/a.out 
0000000000600000  4K r---- /home/vikram/a.out 
0000000000601000  4K rw--- /home/vikram/a.out 
00007f3b0ad37000 1576K r-x-- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f3b0aec1000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f3b0b0c0000  16K r---- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f3b0b0c4000  4K rw--- /lib/x86_64-linux-gnu/libc-2.13.so 
00007f3b0b0c5000  24K rw--- [ anon ] 
00007f3b0b0cb000 132K r-x-- /lib/x86_64-linux-gnu/ld-2.13.so 
00007f3b0b2c3000  12K rw--- [ anon ] 
00007f3b0b2e8000  12K rw--- [ anon ] 
00007f3b0b2eb000  4K r---- /lib/x86_64-linux-gnu/ld-2.13.so 
00007f3b0b2ec000  8K rw--- /lib/x86_64-linux-gnu/ld-2.13.so 
00007fffb1153000 132K rw--- [ stack ] 
00007fffb11c7000  4K r-x-- [ anon ] 
ffffffffff600000  4K r-x-- [ anon ] 
total    3984K 

我的問題是 -

  1. 「/ LIB/x86_64的Linux的-gnu/ld-2.13.so「這個庫在終端1和2有兩個不同的地址(00007f90f279a000和00007f3b0b0cb000)。這是否意味着這個庫在主內存中加載了2次?

  2. 假設的a.out是二進制簡單Hello_World.c程序的

    #include<stdio.h> 
    void main() 
    { printf("Hello World");} 
    

    然後a.out的一部分具有r個&瓦特許可? 簡單地說,這個段包含的源「0000000000601000 4K rw --- /home/vikram/a.out」的哪一部分應該包含?

  3. 爲什麼anon不像其他細分那樣連續?

  4. 什麼「00007f90f2590000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so」此段假定包含....因爲它沒有讀取,寫入,執行權限。

回答

1

1)動態加載器或ld是OS啓動進程後首先執行的。這些地址是進程的虛擬地址,但最終映射到相同的物理內存。

2)過程的數據段。 (初始化數據和BSS) 3)它用於各種目的,如堆,mmap和任何共享內存等。 4)AFAIK其內部私人數據。