내가 이해한 바로는 Linux에서 프로세스 로더는 스택과 같은 프로세스에 대한 "힙" 영역을 자동으로 생성하지 않습니다. 이것이 맞습니까?
나는 /proc/$$/maps
호출하기 전에 malloc()
"힙" 영역이 없습니다 .
답변1
Linux는 힙 및 스택 세그먼트에 대한 영역을 "자동 생성"하지 않습니다.
프로그래밍 언어에는 항상 운영 체제에서 프로그램으로 제어가 전송되는 진입점이 있습니다. C에서는 이것이 main()
함수입니다.
Linux의 각 프로세스에는 32비트 환경에서 4GB, 64비트 환경에서 8TB의 메모리 맵이 있습니다. 이는 운영 체제가 처리할 수 있는 최대 메모리 양입니다. 이는 시스템이 실제로 가지고 있는 물리적 메모리의 양과는 아무런 관련이 없습니다. 각 프로세스는 컴퓨터에 단독으로 존재하는 것 같은 착각을 불러일으킵니다.
호출 전에 main()
운영 체제는 호출 프로그램에 대한 명령줄 요소를 처음에 비어 있던 스택의 "맨 위"로 푸시합니다.스택 세그먼트예. main()
호출 자체가 함수인 경우 전달된 매개변수는 스택 세그먼트로 푸시됩니다.
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
│ │
│ │
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘
이제 귀하의 질문은 다음과 같습니다
나는 를 사용했는데
/proc/$$/maps
, malloc이 호출되기 전에는 "힙" 영역이 없습니다.
이것힙 메모리: 프로세스는 시스템 호출을 사용하여 런타임 시 malloc()
가상 메모리의 비어 있는 부분으로 확장 될 수 있습니다. 이것동적으로 메모리 할당~ 위에데이터내부에힙 세그먼트. 따라서 첫 번째 호출 전에는 힙 영역이나 세그먼트가 없는 것이 정상입니다 malloc()
.
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
├ ─ ─ ─ ─ ─ ┤
│ heap │ <- malloc()'d memory space, growing upwards
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘