2011-02-22 2 views
7

이 페이지에서 http://www.x86-64.org/pipermail/discuss/2004-August/005020.html 그는 응용 프로그램에서 32 비트 코드와 64 비트 코드를 혼합하는 방법이 있다고했습니다. 그는 응용 프로그램이 32 비트 (호환 모드) 인 것으로 가정하고 64 비트 모드로 전환하여 64 비트 코드를 실행하고 그 반대의 경우도 마찬가지입니다.모드 전환을 수행하여 64 비트 프로세스에서 32 비트 코드를 실행할 수 있습니까?

내 OS가 64 비트 Linux이고 내 응용 프로그램이 64 비트라고 가정합니다. 나는 호환성 모드로 전환하고 32 비트 코드를 실행하기 위해 멀리 점프한다. 시스템 호출이나 함수 호출을 할 때 올바르게 작동 할 수 있습니까?

호환 모드와 64 비트 모드간에 모드를 전환하는 데 오버 헤드가 있습니까? 오버 헤드 중 하나는 32 비트와 64 비트에 대해 별도의 스택이 필요하다고 생각합니다.

이 아이디어를 JVM에 통합 할 수 있습니까? 64 비트 JVM에서 32 비트 코드를 동적으로 생성 할 수 있고 모드 전환으로 실행할 수 있습니까?

+0

64 비트 JVM을 사용하는 경우 왜 32 비트 코드를 생성하려고합니까? 64 비트 코드에서 원하는 거의 모든 32 비트 연산을 수행 할 수 있습니다. 대부분의 명령어는 64 비트 모드에서도 32 비트 피연산자를 기본값으로 사용합니다. –

+1

32 비트 코드와 64 비트 코드의 차이점을 비교하고 싶습니다. 어쩌면 긴 형식의 크기 나 각 경우의 실행 시간과 같은 경우에 차이가있을 수 있습니다. –

+0

게시물을 다시 읽어 보면 CS를 수정하는 것이 좋습니다. 이렇게하면 커스텀'ld.so'가 실행될 것입니다. 당신이 그것을 준비했는지 확인하십시오. –

답변

1

32 비트 코드는 32 비트 커널 엔트리 포인트를 사용하기 때문에 개방형 시스템 호출이 좋을 것입니다.

물론 다른 32 비트 코드로만 함수 호출을 할 수 있습니다. 여기에는 libc이 포함되어 있으므로 32 비트 코드는 자체 포함되어 있거나 필요로하는 라이브러리 함수에 썽크 (thunks)를 제공해야합니다. 일반적으로 syscall은 직접 호출되지 않는다는 것을 기억하십시오. 일반적으로 32 비트 코드에서 사용할 수없는 libc 래퍼를 사용합니다.

모드를 전환하는 데 확실히 오버 헤드가 있습니다. 프로세서 설명서를 참조하여 그 내용을 찾아야합니다.

+0

필자는 2 가지 다른 버전의 libc (32 비트 및 64 비트)를 준비해야하지만, dlopen을 사용하여 동적로드 인 경우에도 32 비트 및 64 비트 라이브러리를 실행 파일에로드 할 수 있습니까? 나는 그것이 불가능하다고 생각한다. –

+1

@ Hsiao-Hui Chiu : 아니, 일반적으로 가능하지 않을 것입니다. 그리고 그것은 당신이 어쨌든하고 싶은 것이 아닙니다. 두 개의 서로 다른'libc '는 충돌하는 stdio 버퍼와 유사한 문제가 두 세트 있다는 것을 의미합니다. 대신 긴 모드로 전환 한 다음 64 비트 libc로 호출 한 32 비트 썽크를 작성해야합니다. 매개 변수와 결과의 필요한 순서 지정을 포함합니다. – caf

관련 문제