prosource

_chkstk() 함수의 목적은 무엇입니까?

probook 2023. 7. 22. 10:11
반응형

_chkstk() 함수의 목적은 무엇입니까?

최근에 Visual C++ 컴파일러 옵션을 사용하여 특히 긴 멤버 함수 정의의 소스 + 어셈블리를 출력했습니다.어셈블리 출력에서 스택 프레임이 설정된 후 알 수 없는 호출이 한 번 발생합니다._chkstk()기능.

의 MSDN 페이지에서는 이 기능이 호출되는 이유를 설명하지 않습니다.스택 오버플로 질문 스택에 많은 페이지 크기의 버퍼를 할당하면 메모리가 손상된다는 것도 보았지만 OP와 수락된 답변이 무엇을 말하는지 이해할 수 없습니다.

의 목적은 무엇입니까?_chkstk()CRT 기능?그것은 무엇을 합니까?

사용 중인 스레드에 대한 추가 스택의 Windows 페이지입니다.스택의 끝에는 액세스 불가능한 메모리로 매핑된 가드 페이지가 하나 있습니다. 프로그램이 액세스할 경우(현재 매핑된 것보다 더 많은 스택을 사용하려고 하므로) 액세스 위반이 발생합니다.OS는 장애를 포착하고, 이전 가드 페이지와 동일한 주소의 다른 스택 페이지에 매핑하고, 이전 가드 페이지 바로 위에 새 가드 페이지를 만들고, 위반을 유발한 지침에서 다시 시작합니다.

함수에 둘 이상의 로컬 변수 페이지가 있는 경우, 함수가 액세스하는 첫 번째 주소는 스택의 현재 끝에서 두 페이지 이상이 될 수 있습니다.따라서 OS가 인식하지 못하는 것은 추가 스택이 필요하기 때문입니다.필요한 총 스택이 특히 큰 경우에는 가드 페이지를 넘어 스택에 할당된 가상 주소 공간의 끝을 넘어 실제로 다른 용도로 사용 중인 메모리까지 도달할 수 있습니다.

그렇게,_chkstk로컬 변수에 충분한 공간이 있는지 확인합니다.이렇게 하려면 페이지 크기 간격으로 로컬 변수의 메모리를 차례로 터치하여 가드 페이지(이른바 "스택 프로브")를 놓치지 않도록 해야 합니다.하지만 실제로 그렇게 하는지는 모르겠지만, 아마도 좀 더 직접적인 경로를 사용하여 OS에 일정량의 스택을 매핑하도록 지시합니다.어느 쪽이든 필요한 총 용량이 스택에 사용할 수 있는 가상 주소 공간보다 클 경우 OS에서 정의되지 않은 작업을 수행하는 대신 이에 대해 불만을 제기할 수 있습니다.

는 나는코살니다습봤펴를드▁를 보았습니다.__chkstk한 페이지 간격으로 반복적인 스택 프로브를 수행합니다.그래서 이렇게 하면 OS에 전화를 걸 필요가 없습니다.에 있는 rax추가할 데이터의 크기입니다.은 대상 주소 주소)를 합니다.rsp-rax)에 액세스할 수 있습니다.rax>rsp주소 0에 대해 이 작업을 수행합니다.흥미로운 바로 가기로서, 그것은 먼저 주소를 비교합니다.gs:[10h]이것은 매핑된 현재 가장 낮은 페이지입니다. 대상 주소 >= 이것이면 아무 것도 하지 않습니다.

그런데 64비트 코드의 경우 적어도 두 개의 밑줄로 철자가 지정됩니다.__chkstk__.

언급URL : https://stackoverflow.com/questions/8400118/what-is-the-purpose-of-the-chkstk-function

반응형