답변:
각 행은 /proc/$PID/maps
프로세스 또는 스레드에서 연속 가상 메모리 영역을 설명합니다. 각 행에는 다음 필드가 있습니다.
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
-
대신 a 가 나타납니다 . 지역이되어 있지 않은 경우 공유 , 그것은 개인 A가 있으므로, 대신의 표시됩니다 . 프로세스가 허용되지 않는 방식으로 메모리에 액세스하려고하면 세그먼테이션 결함이 생성됩니다. 시스템 호출을 사용하여 권한을 변경할 수 있습니다 .r
w
x
p
s
mprotect
mmap
) 매핑이 시작되는 파일의 오프셋입니다. 메모리가 파일에서 매핑되지 않은 경우 0입니다.[heap]
, [stack]
또는 [vdso]
. [vdso]
가상 동적 공유 객체를 나타냅니다. 시스템 호출에서 커널 모드로 전환하는 데 사용됩니다. 여기에 좋은 기사가 있습니다 : "linux-gate.so.1은 무엇입니까?"익명의 영역이 많이있을 수 있습니다. 이들은 일반적으로 만들어 mmap
지지만 어떤 파일에도 첨부되지 않습니다. 공유 메모리 또는 힙에 할당되지 않은 버퍼와 같은 기타 여러 가지 용도로 사용됩니다. 예를 들어, pthread 라이브러리는 익명 매핑 된 영역을 새 스레드의 스택으로 사용한다고 생각합니다.
gpm
에서 ELF 헤더 등을 사용하여 바이너리 파일을 처음부터 가상 주소로 매핑합니까? 로더가 ELF 헤더를 구문 분석하고 전체 파일이 아닌 개별 섹션을 매핑해야합니까?
확인하십시오 : 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에서는 경로 이름을 제공하는 필드가 없습니다.
proc(5)
mmap(2)
"리눅스 커널 이해"9.3. 메모리 영역; 16.2. 메모리 매핑 4.4 메모리 영역 "리눅스 가상 메모리 관리자의 이해"