2009-09-09 2 views
114

임베디드 Linux 응용 프로그램의 메모리 사용을 이해하려고합니다./proc/pid/maps 유틸리티/파일은 세부 사항을보기에 좋은 리소스 인 것 같습니다. 불행히도 나는 모든 컬럼과 엔트리를 이해하지 못한다.Linux/proc/id/maps 이해

proc/pid/maps 유틸리티/파일에 대한 유용한 리소스/설명서가 있습니까?

익명 아이 노드 0 항목의 의미는 무엇입니까? 이것들은 더 큰 메모리 세그먼트의 일부인 것으로 보인다.

답변

187

"리눅스 가상 메모리 관리자 이해"를 참조하십시오. 각 행은 다음과 같은 필드가 있습니다

address   perms offset dev inode pathname 
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 
  • 주소를 -이
  • 권한는 프로세스의 주소 공간의 시작과 지역의 끝 주소는 -이 설명하는 방법이 지역의 페이지 수 액세스 할 수 있습니다. 읽기, 쓰기, 실행 및 공유의 네 가지 사용 권한이 있습니다. 읽기/쓰기/실행이 비활성화 된 경우 'r'/ 'w'/ 'x'대신 '-'가 표시됩니다. 지역이 공유되지 않으면 비공개이므로 's'대신 'p'가 표시됩니다. 프로세스가 허용되지 않는 방식으로 메모리에 액세스하려고하면 세그먼트 화 오류가 생성됩니다. 시스템 호출 mprotect을 사용하여 권한을 변경할 수 있습니다.
  • 오프셋 - 영역이 파일 (mmap 사용)에서 매핑 된 경우 매핑이 시작되는 파일의 오프셋입니다. 메모리가 파일에서 매핑되지 않은 경우에만 0입니다.
  • 장치 - 영역이 파일에서 매핑 된 경우 파일이있는 주 및 보조 장치 번호 (16 진수)입니다.
  • inode - 영역이 파일에서 매핑 된 경우이 파일 번호입니다.
  • 경로명 - 영역이 파일에서 매핑 된 경우이 파일의 이름입니다. 이 필드는 익명 매핑 된 영역에 대해 비어 있습니다. 이름이 [heap], [stack] 또는 [vdso] 인 특수 지역도 있습니다. [vdso]은 가상 동적 공유 객체의 약자입니다. 커널 모드로 전환하기 위해 시스템 호출에 사용됩니다. Here's a good article about it.

많은 익명 영역이있을 수 있습니다. 이들은 보통 mmap에 의해 생성되지만 어떤 파일에도 첨부되지 않습니다. 공유 메모리 나 힙에 할당되지 않은 버퍼와 같은 많은 기타 용도로 사용됩니다. 예를 들어, pthread 라이브러리는 익명 매핑 된 영역을 새 스레드의 스택으로 사용한다고 생각합니다.

+4

그렇습니다. pthread는 스택 오버플로 감지를위한 더 작은 섹션을 가진 스택에 대해 8MB 블록을 할당합니다 (생각합니다). 그래서 기본적으로 생성 된 각 pthread는 8Mb의 inode 0 메모리 영역과 4Kb의 inode 0 영역을 할당합니다. – simon

+0

예에서'gpm'은 ELF 헤더 등으로 처음부터 가상 주소에서 바이너리 파일을 매핑하고 있습니까? 로더가 ELF 헤더를 구문 분석하고 전체 파일이 아닌 개별 섹션을 매핑해야합니까? –

8

메모리 매핑은 파일을 메모리에 매핑하는 데 사용되는 것이 아니라 커널에서 RAM을 요청하는 도구이기도합니다. 당신의 스택, 힙, BSS 세그먼트보다 9.3 "리눅스 커널의 이해"

18

proc(5)

mmap(2)

-이 그 아이 노드 0 항목이다. 메모리 영역; 16.2. 메모리 매핑

/proc/$PID/maps의 각 행은 프로세스 또는 스레드에서 연속 가상 메모리 영역을 설명 4.4 메모리 영역

0

확인하시기 바랍니다 : http://man7.org/linux/man-pages/man5/proc.5.html

address   perms offset dev inode  pathname 
00400000-00452000 r-xp 00000000 08:02 173521  /usr/bin/dbus-daemon 

주소 필드는 매핑을 차지하는 과정에서 주소 공간입니다.

파마 필드는 권한의 집합입니다 :

r = read 
w = write 
x = execute 
s = shared 
p = private (copy on write) 

오프셋 필드는 파일/뭐든에의 오프셋 (offset)입니다;

dev는 장치입니다 (major : minor);

inode는 해당 장치의 inode이며, 0은 BSS (초기화되지 않은 데이터)의 경우처럼 inode가 메모리 영역과 연관되어 있지 않음을 나타냅니다.

경로 이름 필드는 대개 매핑 을 뒷받침하는 파일입니다. ELF 파일의 경우, ELF 프로그램 헤더 (readelf -l)의 오프셋 (Offset) 필드를보고 오프셋 필드를 으로 쉽게 조정할 수 있습니다.

Linux 2.0에서는 경로 이름을 제공하는 입력란이 없습니다.