/proc/pid/maps의 공유 라이브러리 매핑

/proc/pid/maps의 공유 라이브러리 매핑

/proc/pid/maps동일한 라이브러리에 일부 레코드가 포함되어 있는 이유는 무엇입니까 ? 예는 다음과 같습니다.

7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861                     /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20

무슨 뜻이에요?

답변1

이 네 개의 레코드는 서로 다른 권한을 가지므로 병합할 수 없습니다.

  • r-xp항목은 실행 가능한 메모리 블록( x권한 플래그)을 설명합니다. 이것이 코드입니다.
  • r--p항목은 읽기 전용 메모리 블록( r권한 플래그)을 설명합니다. 그것은 정적 데이터(상수)입니다.
  • rw-p항목은 쓰기 가능한 메모리 블록( w권한 플래그)을 설명합니다. 이는 라이브러리의 전역 변수입니다.
  • ---p항목은 권한(또는 이에 매핑된 메모리)이 없는 주소 공간 블록을 설명합니다.

모두 비공개( p플래그)입니다. 즉, 한 프로세스가 페이지를 수정하는 경우(쓰기 가능한 부분에만 적용됨) 페이지가 복사되고(쓰기 시 복사) 다른 프로세스에는 변경 사항이 표시되지 않습니다.

마지막 항목은 코드 세그먼트와 데이터 세그먼트 사이의 간격으로, 어떤 경우에는 GNU 링커에 의해 명시적으로 삽입됩니다. 이 간격의 목적은 코드(동일한 라이브러리를 사용하는 프로세스 간에 공유 가능)와 쓰기 가능한 데이터(공유 불가능)가 결코 동일한 페이지에 있지 않도록 하는 것입니다. 간격의 크기는 2MB입니다. 이는 아키텍처(amd64)에서 Linux가 사용하는 최대 페이지 크기이기 때문입니다. 바라보다Linux에서 사용할 수 없는 것처럼 보이는 메모리 매핑의 목적은 무엇입니까?자세한 내용은.

1 대부분의 페이지는 "일반" 페이지 크기인 4kB입니다. 그러나 MMU 간접 참조를 덜 사용하는 페이지가 있을 수 있습니다. 이는 애플리케이션이 실제로 매우 큰 메모리 블록을 사용하지 않는 한 약간 더 빠르지만 많은 공간을 낭비합니다. 리눅스는 이것을 호출한다큰 페이지.

매핑되지 않은 격차 및 추가 정보의 출처:gnome-panel이 290MB를 사용하는 이유는 무엇입니까?RJK 제공. 당신은 또한 볼 수 있습니다/proc/PID/mapsLinux 커널 문서의 항목,Linux /proc/id/maps 이해그리고/proc/$pid/maps는 x86_64 Linux에서 rwx 권한이 없는 페이지를 표시합니다.스택 오버플로에.

관련 정보