2013-09-26 1 views
0

, 나는이내용은/proc/PID/I는 실행중인 프로세스의 내용을 인쇄 할 때의 a.out 두 개의 메모리 영역에로드되는 이유는

00400000-00401000 r-xp 00000000 08:01 137910        /home/user/process/a.out 
00600000-00601000 rw-p 00000000 08:01 137910        /home/user/process/a.out 
02434000-02455000 rw-p 00000000 00:00 0         [heap] 

같은 결과를 얻었다 맵을? 그것은 동일한 부품 또는 다른 부품입니까? 하나는 r-xp이고 다른 하나는 rw-p입니다. 프로그램에서 malloc을 사용하여 정수 크기를 할당했지만, 힙의 크기는 그 이상으로 표시됩니다. 왜 그래야만하지?

답변

2

0x400000의 r-xp 영역은 텍스트 (코드) 섹션입니다. 읽기 쉽고 실행 가능하지만 쓰기가 가능하지 않습니다.

rw-p 0x600000의 영역이 데이터 섹션입니다. 읽기 쉽고 쓸 수 있지만 실행 가능하지는 않습니다.

readelf -S a.out는 실행 파일에 당신에게 섹션을 표시합니다, 그들은 메모리에로드 될 것 곳 (첫 번째 섹션 - 투 - 세그먼트 매핑을 통해.)


귀하의 실험에 대한 malloc는 4 바이트를 보내고 이것이 메모리 관리가 작동하는 방식이 아니기 때문에 충분하지 않습니다. malloc에 전화 할 때, libc 구현은 유지 보수중인 대형 풀에서 작은 조각을 조각 낼 것입니다. (이것은 단지 프로세스 인입니다. 운영체제가 즉시 개입되지 않습니다.) 풀을 고갈 시키면 커널에 더 많은 메모리를주기 위해 brk (또는 mmap) 시스템 호출을 사용합니다.

malloc 메모리가 훨씬 큰 경우 힙이 커질 수 있습니다. 또한 실행 파일에 strace을 실행하고 실제로 brk 또는 memmap 시스템 호출을하는시기를 확인할 수 있습니다.