제가 이해한 바에 따르면 Linux 커널은 각 프로세스가 시작되기 전에 각 프로세스에 스택을 할당하며 이 초기 크기는 구성 가능합니다. 프로세스는 PUSH
CPU 명령을 통해 데이터를 스택으로 직접 전송할 수 있습니다. 즉, 운영 체제는 이러한 각 단계에 관여하지 않습니다.
그러나 어느 시점에서는 PUSH
작업이 중단될 수 있습니다.초과하다할당된 스택 크기 및 커널이 더 큰 스택 크기를 할당할 수 있는지 여부에 따라 여러 가지 일이 발생할 수 있습니다.
내 질문은: 초기화 후에는 어떻게 되나요 PUSH
? 시스템은 "스택 오버플로"를 어떻게 감지하고 이를 요구합니까?자라다최종까지 스택이력서프로세스 실행?
도움이 된다면 x86 아키텍처에 집중할 수 있습니다.
내 생각에는 다음과 같은 당사자가 관련되어 있습니다.
- CPU
- 메모리 관리 유닛
- 핵심
- 프로세스
예를 들어 "스택 오버플로, CPU인가요? MMU인가요? 이로 인해 문제가 발생합니까?"를 누가 감지합니까?하드웨어 인터럽트? 다른 건 없나요? 그렇다면 여기서는 누가 처리하나요? (스택이 최종적으로 확장되고 프로세스가 다음 CPU 명령을 재개할 수 있을 때까지?)
답변1
하드웨어 또는 소프트웨어에서 스택 오버플로를 감지합니까?
MMU는 스택의 예상 크기 이후에 유효하지 않은 메모리 주소가 포함된 일부 패딩을 남깁니다. 스택을 너무 많이 늘리려고 하면 역참조 및 유효하지 않은 메모리 주소가 발생하고 MMU에서 오류가 발생합니다.세그폴트.
당신은 또한 사용할 수 있습니다카나리아 값스택에 있지만 들어가지는 않습니다.
일반적으로 컴파일러는 코드의 정적 분석을 수행하고 스택 크기 조정을 방지하기 위해 필요한 스택 크기를 찾으려고 합니다.-fstack-usage는 gcc가 수행하는 작업에 대한 통찰력을 제공합니다.
C 표준은 C 스택이 커져야 할 때 암시적으로 mremap을 호출한다고 정의합니다. 이는 Linux 커널이 이러한 모든 작업을 자체적으로 처리한다는 의미입니다.
하나지나친 단순화타임라인은 다음과 같습니다.
푸시->MMU 분할 오류->리눅스가 그것을 감지합니다->Linux 리맵 메모리->삽입된 값->쇼는 계속된다
나는 전문가가 아니기 때문에 이것을 명확한 대답으로 받아들이지 말고 해당 주제에 대해 더 자세히 읽어볼 것을 강력히 권합니다.