프로그램의 메모리 레이아웃에서 "커널 스택", "C 런타임 시작 함수의 프레임" 및 "main()의 프레임"은 어디에 있습니까?

프로그램의 메모리 레이아웃에서 "커널 스택", "C 런타임 시작 함수의 프레임" 및 "main()의 프레임"은 어디에 있습니까?

Linux 프로그래밍 인터페이스에서:

여기에 이미지 설명을 입력하세요.

  1. 위 그림에서 커널 스택(아래 인용문에 언급됨)은 어디에 있습니까?

    위 그림의 윗부분 "커널(프로세스 가상 메모리에 매핑되지만 프로그램에서는 접근하지 않음)"인가요?

    용어 사용자 스택 여기서 설명하는 스택을 커널 스택과 구별하는 데 사용됩니다.커널 스택시스템 호출 실행 중에 내부적으로 호출되는 함수에 대한 스택으로 사용되는 커널 메모리에 유지되는 프로세스별 메모리 영역입니다. (커널은 사용자 스택이 보호되지 않은 사용자 메모리에 있기 때문에 이 목적으로 사용할 수 없습니다.)

  2. 위 다이어그램에서 "C 런타임 시작 기능의 프레임워크"와 "main()의 프레임워크"(아래 다이어그램에 언급됨)는 어디에 있습니까?

    위 그림의 "argv, Environ"은 "C 런타임 시작 함수의 프레임워크", "main()의 프레임워크" 또는 둘 다의 일부입니까?

    여기에 이미지 설명을 입력하세요.

  3. 0x00000000과 0x08048000 사이의 가장 낮은 세그먼트의 목적은 무엇입니까?

감사해요.

답변1

  1. 그렇지 않습니다커널 스택. 각 스레드에는 프로세스가 시스템 호출을 할 때 스택 공간으로 사용되는 메모리 영역이 있습니다. 또한 인터럽트 핸들러가 사용하는 각 CPU마다 하나씩 별도의 "인터럽트 스택"이 있습니다. 이러한 메모리 영역은 커널 주소 공간( 0xc0000000위 그림 참조)에 상주합니다.

  2. 스택 프레임(C 런타임 프레임, 메인 프레임 등)은 스택의 일부입니다. 프로세스 매개변수( argv)와 환경은 별도의 영역이며 스택의 일부가 아닙니다.

  3. 0x0와 사이의 영역 0x08048000(약 128MB)은 어떠한 용도로도 사용되지 않습니다. 원래 i386 System V ABI는 이 영역을 스택용으로 예약했지만 Linux는 다르게 작동합니다. 이 영역을 사용하지 않는 것은 RAM을 낭비하는 것이 아니라 해당 영역이 매핑되지 않기 때문에 주소 공간을 낭비하는 것입니다. 이 정보는 32비트 x86 아키텍처에서 수행되는 방법을 설명하므로 이제 거의 완전히 최신 정보가 아닙니다. 오늘날 32비트 전용 x86 시스템은 찾기 어렵고 배포판에서는 이에 대한 지원을 단계적으로 중단하고 있습니다.

답변2

에서 인용csapp 3위9장:

여기에 이미지 설명을 입력하세요.

커널 가상 메모리의 다른 영역에는 프로세스마다 다른 데이터가 포함되어 있습니다. 예로는 페이지 테이블, 프로세스 컨텍스트에서 코드를 실행할 때 커널이 사용하는 스택, 가상 주소 공간의 현재 구성을 추적하는 다양한 데이터 구조 등이 있습니다.

나는 모든 프로세스에 커널 스택이 있다고 생각합니다. 적어도 시스템 호출을 실행하는 경우 데이터를 저장하기 위해 관리자 권한이 필요한 커널 내장 기능을 호출할 수 있습니다. 커널 인터럽트 핸들러에서도 작동합니다.

관련된답변

  1. 각 프로세스에는 자체 커널 스택이 있습니까?

모든 프로세스뿐만 아니라 모든 스레드에는 자체 커널 스택(실제로는 자체 사용자 스택)이 있습니다. 프로세스와 스레드(Linux의 경우)의 유일한 차이점은 여러 스레드가 주소 공간을 공유할 수 있다는 것입니다(프로세스 형성).

관련 정보