Linux / proc / id / maps 이해


156

임베디드 Linux 응용 프로그램의 메모리 사용을 이해하려고합니다. /proc/pid/maps유틸리티 / 파일 세부 사항을보고를위한 좋은 자원이 될 것으로 보인다. 불행히도 나는 모든 열과 항목을 이해하지 못합니다.

익명의 inode 0 항목은 무엇을 의미합니까? 이들은 더 큰 메모리 세그먼트 인 것 같습니다.


1
proc(5) mmap(2)"리눅스 커널 이해"9.3. 메모리 영역; 16.2. 메모리 매핑 4.4 메모리 영역 "리눅스 가상 메모리 관리자의 이해"
wRAR

답변:


263

각 행은 /proc/$PID/maps프로세스 또는 스레드에서 연속 가상 메모리 영역을 설명합니다. 각 행에는 다음 필드가 있습니다.

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • 주소 - 이것은 프로세스의 주소 공간에서 지역의 시작과 끝 주소입니다
  • 권한 -지역의 페이지에 액세스하는 방법을 설명합니다. 읽기, 쓰기, 실행 및 공유의 네 가지 권한이 있습니다. 읽기 / 쓰기 / 실행이 비활성화되면 / / -대신 a 가 나타납니다 . 지역이되어 있지 않은 경우 공유 , 그것은 개인 A가 있으므로, 대신의 표시됩니다 . 프로세스가 허용되지 않는 방식으로 메모리에 액세스하려고하면 세그먼테이션 결함이 생성됩니다. 시스템 호출을 사용하여 권한을 변경할 수 있습니다 .rwxpsmprotect
  • offset- 영역이 파일에서 매핑 된 경우 (를 사용하여 mmap) 매핑이 시작되는 파일의 오프셋입니다. 메모리가 파일에서 매핑되지 않은 경우 0입니다.
  • 장치 -영역이 파일에서 매핑 된 경우 파일이있는 주 및 부 장치 번호 (16 진수)입니다.
  • inode- 영역이 파일에서 매핑 된 경우 파일 번호입니다.
  • 경로명 영역이 파일에서 매핑 된 경우 파일 이름입니다. 익명 매핑 된 영역의 경우이 필드는 비어 있습니다. 이 이름을 가진 특별한 지역처럼 또한 [heap], [stack]또는 [vdso]. [vdso]가상 동적 공유 객체를 나타냅니다. 시스템 호출에서 커널 모드로 전환하는 데 사용됩니다. 여기에 좋은 기사가 있습니다 : "linux-gate.so.1은 무엇입니까?"

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


4
예, pthread는 스택 오버플로 감지를 위해 더 작은 섹션이있는 스택에 8Mb 블록을 할당하고 있습니다 (생각합니다). 따라서 생성 된 각 pthread는 기본적으로 8Mb의 inode 0 메모리 영역과 4Kb의 inode 0 영역을 할당합니다.
simon

따라서 귀하의 예 gpm에서 ELF 헤더 등을 사용하여 바이너리 파일을 처음부터 가상 주소로 매핑합니까? 로더가 ELF 헤더를 구문 분석하고 전체 파일이 아닌 개별 섹션을 매핑해야합니까?
Dmitry Grigoryev

9

메모리 매핑은 파일을 메모리에 매핑하는 데 사용될뿐만 아니라 커널에서 RAM을 요청하는 도구이기도합니다. 이것들은 inode 0 항목입니다-스택, 힙, CSS 세그먼트 등


5

확인하십시오 : 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

주소 필드는 매핑이 차지하는 프로세스의 주소 공간입니다.

perms 필드는 권한 세트입니다.

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

오프셋 필드는 파일 / 무엇에 대한 오프셋입니다.

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

inode는 해당 장치의 inode입니다 .0은 BSS (초기화되지 않은 데이터)의 경우와 같이 메모리 영역과 관련된 inode가 없음을 나타냅니다.

경로 이름 필드는 일반적으로 매핑을 지원하는 파일입니다. ELF 파일의 경우 ELF 프로그램 헤더의 오프셋 필드 (readelf -l)를 보면 오프셋 필드와 쉽게 조정할 수 있습니다.

Linux 2.0에서는 경로 이름을 제공하는 필드가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.