0

여기에서는 두 개의 다른 터미널에서 동일한 프로그램의 두 인스턴스를 실행하고 있습니다. 이들의 프로세스 맵은 제 1 터미널에서프로세스 맵에 대한 질문

입니다 -

[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에-리눅스 -gnu/ld-2.13.so "이 라이브러리는 터미널 1과 2에 두 개의 다른 주소 (00007f90f279a000과 00007f3b0b0cb000)를 가지고 있습니다. 이 라이브러리가 메인 메모리에 2 번로드되었음을 의미합니까?

  2. 가정의 a.out은 간단 Hello_World.c 파일 프로그램의 바이너리

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

    다음의 허가 w R &을 가지고의 a.out의 어떤 부분? "0000000000601000 4K rw ---/home/vikram/a.out"소스의 어느 부분에이 세그먼트가 들어 있다고 가정합니까?

  3. 왜 다른 세그먼트와 같이 연속적이지는 않습니까?

  4. "00007f90f2590000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so"이 세그먼트는 ....을 포함한다고 가정합니다. 읽기, 쓰기, 실행 권한이 없기 때문에 .... .

답변

1

1) OS가 프로세스를 시작한 후 동적 로더 또는 ld가 먼저 실행됩니다. 이러한 주소는 프로세스의 가상 주소이지만 궁극적으로 동일한 실제 메모리에 매핑됩니다.

2) 프로세스의 데이터 세그먼트. (초기화 된 데이터와 BSS 모두) 힙, mmap 및 공유 메모리 등의 다양한 용도로 사용됩니다. 4) 내부 개인 데이터를 AFAIK합니다.