Linux에서 힙 영역/세그먼트 생성

Linux에서 힙 영역/세그먼트 생성

내가 이해한 바로는 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└───────────┘

관련 정보