0

ここでは、2 つの異なる端末で同じプログラムの 2 つのインスタンスを実行しています。それらのプロセスマップは

最初のターミナルで -

vikram@vikram-Studio-XPS-1645:~$ 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

第2ターミナルでは -

vikram@vikram-Studio-XPS-1645:~$ 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 に 2 つの異なるアドレス ( 00007f90f279a000 と 00007f3b0b0cb000 ) があります。このライブラリがメイン メモリに 2 回読み込まれるということですか。

  2. a.out が単純な Hello_World.c プログラムのバイナリであると仮定します

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

    次に、a.out のどの部分に r & w パーミッションがありますか? 簡単に言えば、ソース「0000000000601000 4K rw--- /home/vikram/a.out」のどの部分がこのセグメントに含まれていると思われますか?

  3. anon が他のセグメントのように連続していないのはなぜですか?

  4. What " 00007f90f2590000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so " このセグメントには .... 読み取り、書き込み、実行権限がないため、含まれているはずです。

4

1 に答える 1

1

1) OS がプロセスを開始した後、最初に実行されるのはダイナミックローダーまたは ld です。これらのアドレスはプロセスの仮想アドレスですが、最終的には同じ物理メモリにマップされます。

2) プロセスのデータ セグメント。(初期化されたデータとBSSの両方)3)ヒープ、mmap、共有メモリなど、さまざまな目的で使用されます。4)内部のプライベートデータの知る限り。

于 2012-03-24T09:57:19.447 に答える