2012-03-22 5 views
17

pmap -x 명령을 사용하여 Linux x86-64에서 프로세스의 메모리 맵을 보려고했습니다. 나는 pmap의 결과물을 보면서 혼란스러워했다. 특히 동적 라이브러리를 매핑하기위한 항목입니다. 그들에 대한 항목이 여러 개 있습니다 (실제로 모든 항목이 4 개이며, 일부 항목은 3 개 항목이 있습니다). 다음은 예를 들어이 더 페이지 권한이없는 동안 라이브러리 각각에 대한 두 번째 행은 항상 2메가바이트의 크기가pmap 출력을 이해하십시오

Address   Kbytes RSS Dirty Mode Mapping 

00000036ca200000  88  64  0 r-x-- libpthread-2.5.so 
00000036ca216000 2044  0  0 ----- libpthread-2.5.so 
00000036ca415000  4  4  4 r---- libpthread-2.5.so 
00000036ca416000  4  4  4 rw--- libpthread-2.5.so 

입니다. 모든 도서관에서 RSS는 항상 0 인 것처럼 보입니다. 마지막 두 행 또한 동일한 크기 (기본 페이지 크기)와 동일한 사용 권한 (소수 라이브러리에는 rw 매핑이 없음)이 있습니다.

아무도 이것에 대한 설명이 있습니까? 실제로 읽기 전용 보호가있는 매핑이 라이브러리의 메타 데이터를 읽는 로더에 의해 수행되는 반면 실행 권한이있는 부분은 실제로 라이브러리의 코드 인 것처럼 느껴질 수 있습니다. 나는 틀릴지도 모른다.

하지만 그 중간 행에 대해서는 단서가 없습니다. 허가가없고 사용법이 없습니까? 누구나 여기에 지혜가 있습니다.

또한 익명의 메모리에 있다고보고 된 페이지 몇 개가 보이며 모드 비트가 설정되어 있지 않습니다. 이것들은 무엇을 나타내는가?

+0

[/ proc/$ pid/maps의 가능한 복제본은 x86 \ _64 linux에서 rwx 권한이없는 페이지를 보여줍니다] (http://stackoverflow.com/questions/16524895/proc-pid-maps-shows-pages-with) -no-rwx-permissions-on-x86-64-linux) –

+0

은 오타를 수정하려고했습니다 : 라이브러리에 대한 코드를 실행 가능한 권한과 함께 사용합니다 * ... "is"가 누락되었지만있을 수없는 것 같습니다 100 % 확실; 너 도울 수있어? –

답변

4

우선, 동일한 프로세스가 둘 이상의 메모리 사용 인스턴스를 사용할 수있는 경우가있을 수 있습니다. 이것이 당신이 알고 싶은 것이면 나는 모른다. 필자는 Linux에서 브라우저를 사용하면서 탭을 하나만 열고 top 명령을 사용하면 메모리 사용량 목록에 4 가지 이상의 사용법을 보여 주며 10MB 이상의 메모리를 차지하는 것으로 나타났습니다. 나는 동일한 프로세스에 의해 실행되는 스레드 수가 더 많아서 ok라고 생각한다.

이 링크는 사용 예제 자체에서 관찰 할 경우 유용 할 수 있습니다. -x 명령의 매핑은 더 많은 사용법을 보여줍니다.

이 보호

http://www.cyberciti.biz/tips/howto-find-memory-used-by-program.html

3

는 "----"페이지는 라이브러리의 코드 및 데이터 세그먼트 사이 색인에서 포인터를 방지하는 가드 페이지입니다. 그것들은 프로세스의 가상 공간에만 존재하며 포인터가 세그먼트의 끝을 지나칠 경우 오류가 발생합니다.

공유 라이브러리 파일에 언급되지 않은 경우 할당 확장을위한 버퍼 역할을하고 있다고합니다. malloc 또는 스택 증가. 예를 들어, glibc는 스레드 로컬 할당 영역을 위해 커널에서 대량의 주소 공간을 요청하고 malloc 된 할당을 위해 느리게 소비합니다. JVM의 훨씬 더 큰 pmap에는 RW 페이지를 따르거나 두 개의 큰 RW 할당 사이의 공간을 채우고 이들 사이의 경계가 RW 페이지가 확장 될 때마다 채워지는 몇 가지가 있습니다. 이와 같은 X86_64 보호 페이지에서는 CPU의 메모리 보호 시스템을 사용하여 불량 포인터 역 참조를 포착 할 수 있습니다.