2013-03-19 3 views
0

64 비트 Windows에서 C++로 JIT 컴파일러를 작성하면 생성 된 코드에서 C++로 작성된 런타임 기능을 호출해야하는 경우가 있습니다. 지금은 VirtualAlloc(0, bytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE)으로 생성 된 코드를 배치 할 메모리를 할당하고 있습니다. 할당 된 메모리가 달리 실행 가능하지 않기 때문에 마지막 플래그가 중요합니다.코드 영역의 32 비트 변위 이내의 실행 가능 메모리

VirtualAlloc은 64 비트 주소 공간의 어느 곳에서나 메모리를 반환 할 수 있습니다 (일반적으로 4GB 이상이 필요하므로 64 비트 주소 지정이 필요함).하지만 가장 효율적입니다. 형태의 x64 call 명령어는 32 비트 IP 상대 오프셋을 원하며 생성 된 코드의 양은 4 기가 바이트 미만이므로 C++에서 컴파일 된 코드의 32 비트 이동 내에서 위치를 찾는 것이 좋습니다.

방법이 있나요?

답변

1

할당을 수행하려는 가상 주소를 첫 번째 인수로 지정할 수 있습니다. 원하는 경계 내에서 할당을 얻으려면 가상 메모리 영역을 먼저 예약 한 다음 예약 된 공간에서 필요할 때 커밋 된 메모리를 요청할 수 있습니다. 기본적으로 MEM_TOP_DOWN이 지정되거나 시스템이 포인터 잘림 문제를 잡기 위해 메모리 레이아웃을 위에서 아래로 수행하지 않는 한 할당은 맨 아래로 발생합니다. 요지는 경계 내에서만 할당 할 가능성을 높일 수 있지만 할당이 경계를 벗어날 때 처리 할 코드가 있어야한다는 것입니다.