2010-05-14 3 views

답변

2

"JITer"는 힙 또는 스택에 공간을 할당하고 어셈블리 코드를 삽입합니다. 아니요, 자체 수정 코드는 완벽합니다. VirtualProtect (Windows) 및 mmap (Unix)은 페이지를 실행 파일로 매핑 할 수 있습니다. 범용 운영 체제는 기본적으로 실행 페이지를 읽기/실행으로 표시하지만 쓰기는 표시하지 않으며, 일반적으로 런타임에이를 변경할 수 있습니다.

코드를 수정할 방법이 없으면 고정 된 가상 주소로로드되고 각 프로세스의 주소 공간에 공유되지 않는 한 dll을로드 할 수 없습니다. 다음 dll 지옥 대신 주소 공간 지옥을 얻을 것이다.

NX 비트 또는 DEP 등을 들었을 때, 실행되지 않는 코드를 실행하지 못하도록 막아 냈습니다. 스택 오버플로 등을 방지하는 데 도움이됩니다.

+0

은 오랜 시간이 지나서 자체 수정 작업을 망칠 필요가 없지만 NX 비트 세트는 NX가 자체 수정을 허용하는 메모리 부분을 막지 않을 것입니다. – SyntaxT3rr0r

+0

@WizardOfOdds : 페이지 테이블 항목에 NX 비트를 설정할 수 있습니다. 명령 포인터가 설정된 페이지에 도달하면 페이지 폴트를 발생 시키도록 프로세서에 지시합니다. Windows에서는 페이지를 비 실행 파일로 표시 할 수 있지만 NX 비트를 지원하는 프로세서 (모든 최신 모듈)가 아니면 x86에서 실제로 아무 것도 수행하지 않는다고 생각합니다. –

0

JIT 코드는 최적화 된 기계 코드를 대체하지 않습니다. 로드 된 Java 바이트 코드를 대체합니다. OpenJDK에서 이것이 어떻게 구현되는지는 모르겠지만, 일반적으로 JVM은 바이트 코드를로드하고 코드를 실행하는 가상 함수 또는 가상 함수가있는 클래스의 내부 구조의 일부 형식으로 유지합니다. JIT (just-in-time) 컴파일시 해당 내부 구조에 대한 포인터는 동일한 인터페이스를 가진 클래스에 대한 포인터로 대체됩니다. 기본 표현은 Java 바이트 코드가 아닌 기본 기계 코드이며 가상 메소드는 다음과 같이 구현됩니다. 그들은 바이트 코드를 해석하기보다는 원시 코드를 호출합니다. 코드의 수정은 없으며 단순히 다른 장소를 가리 킵니다.

+0

JIT는 적응 최적화로 인해 기계 코드를 다시 최적화 할 수 있습니다. 이 경우 아마도 이전에 최적화 된 기계 코드를 버리고 새 코드에 대한 새 블록을 할당하고 포인터를이 코드로 바꿉니다. –

관련 문제