_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
'prosource' 카테고리의 다른 글
모듈의 정규식이 단어 경계(\b)를 지원합니까? (0) | 2023.07.22 |
---|---|
Spring Boot에서 사전 인증 헤더 기반 인증을 설정하는 방법은 무엇입니까? (0) | 2023.07.22 |
명명된 매개 변수의 문자열 형식을 지정하시겠습니까? (0) | 2023.07.22 |
gcc, 엄격한 별칭 지정 및 조합을 통한 캐스팅 (0) | 2023.07.22 |
Spring Boot 플러그인을 사용하려면 Gradle 4.10 이상이 필요합니다.현재 버전은 Gradle 4.1입니다. (0) | 2023.07.22 |