프로세스가 할당된 스택을 초과할 때 이벤트의 순서와 운영 체제 참여

프로세스가 할당된 스택을 초과할 때 이벤트의 순서와 운영 체제 참여

제가 이해한 바에 따르면 Linux 커널은 각 프로세스가 시작되기 전에 각 프로세스에 스택을 할당하며 이 초기 크기는 구성 가능합니다. 프로세스는 PUSHCPU 명령을 통해 데이터를 스택으로 직접 전송할 수 있습니다. 즉, 운영 체제는 이러한 각 단계에 관여하지 않습니다.

그러나 어느 시점에서는 PUSH작업이 중단될 수 있습니다.초과하다할당된 스택 크기 및 커널이 더 큰 스택 크기를 할당할 수 있는지 여부에 따라 여러 가지 일이 발생할 수 있습니다.

내 질문은: 초기화 후에는 어떻게 되나요 PUSH? 시스템은 "스택 오버플로"를 어떻게 감지하고 이를 요구합니까?자라다최종까지 스택이력서프로세스 실행?

도움이 된다면 x86 아키텍처에 집중할 수 있습니다.

내 생각에는 다음과 같은 당사자가 관련되어 있습니다.

  • CPU
  • 메모리 관리 유닛
  • 핵심
  • 프로세스

예를 들어 "스택 오버플로, CPU인가요? MMU인가요? 이로 인해 문제가 발생합니까?"를 누가 감지합니까?하드웨어 인터럽트? 다른 건 없나요? 그렇다면 여기서는 누가 처리하나요? (스택이 최종적으로 확장되고 프로세스가 다음 CPU 명령을 재개할 수 있을 때까지?)

답변1

Linux에서 스택 할당은 어떻게 작동합니까?

하드웨어 또는 소프트웨어에서 스택 오버플로를 감지합니까?

MMU는 스택의 예상 크기 이후에 유효하지 않은 메모리 주소가 포함된 일부 패딩을 남깁니다. 스택을 너무 많이 늘리려고 하면 역참조 및 유효하지 않은 메모리 주소가 발생하고 MMU에서 오류가 발생합니다.세그폴트.

당신은 또한 사용할 수 있습니다카나리아 값스택에 있지만 들어가지는 않습니다.

일반적으로 컴파일러는 코드의 정적 분석을 수행하고 스택 크기 조정을 방지하기 위해 필요한 스택 크기를 찾으려고 합니다.-fstack-usage는 gcc가 수행하는 작업에 대한 통찰력을 제공합니다.

C 표준은 C 스택이 커져야 할 때 암시적으로 mremap을 호출한다고 정의합니다. 이는 Linux 커널이 이러한 모든 작업을 자체적으로 처리한다는 의미입니다.

하나지나친 단순화타임라인은 다음과 같습니다.

푸시->MMU 분할 오류->리눅스가 그것을 감지합니다->Linux 리맵 메모리->삽입된 값->쇼는 계속된다

나는 전문가가 아니기 때문에 이것을 명확한 대답으로 받아들이지 말고 해당 주제에 대해 더 자세히 읽어볼 것을 강력히 권합니다.

관련 정보