2014-09-12 2 views
2

여기에 jdk의 중단 점 코드가 있습니다.ARM에서 JDK의 BREAKPOINT가 주어진 특수 값을 정의하는 이유는 무엇입니까?

#ifdef ARM 
    #ifdef SOLARIS 
    #define BREAKPOINT __asm__ volatile (".long 0xe1200070") 
    #else 
    #define BREAKPOINT __asm__ volatile (".long 0xe7f001f0") 
    #endif 
#else 
    extern "C" void breakpoint(); 
    #define BREAKPOINT ::breakpoint() 
#endif 

나는 '.long 0xe1200070'와 '.long 0xe7f001f0'은 특별한 의미를 가지고 있는지 알고 싶어?

답변

1

HotSpot을 ARM으로 이식 할 때 외부 breakpoint() 함수를 호출하는 대신 브레이크 포인트를 인라인하는 것이 유용하다는 것을 알았습니다. JVM이이 위치에 도달하면 주변 명령과 관련 레지스터 값인 충돌의 의미있는 컨텍스트가 생깁니다.

.long 0xe7f001f0은 정의되지 않은 명령어의 인코딩입니다. ARM 0x.7f...f. 명령어 공간은 정의되지 않은 명령어 예외를 생성하기 위해 예약되어 있습니다. 분명히 그것에 대한 니모닉이 없으므로 숫자 리터럴이됩니다. GDB는 arm-eabi에서 중단 점에 대해 동일한 opcode를 사용합니다.

.long 0xe1200070은 수동으로 인코딩 된 BKPT opcode입니다. 필자는 Solaris/ARM 플랫폼을 보지 못했지만 일반적으로 브레이크 포인트가 여기에 인코딩되는 방식이라고 생각합니다.