많은 개념을 혼합하고 있습니다. 상대 주소는 절대 주소로 변환 할 기본 주소가 필요한 주소입니다. 그 변환은 많은 방법으로 일어날 수 있습니다. 하나의 웨이는로드시로드를 변환하지만, 메모리 위치에 액세스해야 할 때 수학적으로 상대 주소 지정을 본질적으로 지원하는 CPU 명령어와 함께 사용할 수도 있습니다.
운영 체제가 가상 메모리를 지원하는 경우 일반 프로세스에서 사용되는 모든 주소는 상대 주소 또는 절대 주소를 기준으로 논리적 주소입니다. 논리 주소에서 실제 주소로의 변환은 응용 프로그램의 범위를 벗어나며 질문에서 언급 한 다른 개념과는 독립적입니다.
클래스 파일 형식은 메모리 위치와 관련하여 작동하지 않습니다.
상위 수준에서 "절대"및 "상대"용어를 적용하려는 경우 상수 풀 인덱스는 절대입니다. 실제 인덱스를 식별하는 데 기본 인덱스가 필요하지 않기 때문입니다. 로드 된 파일 내에서 메모리 위치를 찾으려면 클래스 파일이로드 된 주소를 사용해야 할뿐만 아니라 상수 풀이 원하는대로 전체 상수 풀을 원하는 항목까지 구문 분석해야합니다. 다른 바이트 크기. 이러한 이유로 항목은 일반적으로 전혀 조회되지 않습니다. 대신 전체 풀이 단일 패스에서 일정한 항목 크기를 갖는 JVM 특정 표현으로 변환 된 후 JVM은 클래스 파일의 메모리 위치와 별 개인 테이블의 항목을 조회 할 수 있습니다.
바이트 코드 명령어 내에서 상대 오프셋이 사용되므로 절대 위치를 얻으려면 현재 명령어의 위치를 추가해야하지만이 방법이 질문에 지정된 개념에 맞지 않는 점에 유의하십시오. 절대 위치는 여전히 명령어 시퀀스 내의 위치이므로 주소에 대해 말할 때 코드의 메모리 위치에 상대적입니다. 또한 "컴파일 타임에 바인딩이 가능하지 않기"때문에 상대 오프셋은 사용되지 않으며 결과 절대 위치는 컴파일 타임에 알려집니다. Java 바이트 코드 명령 세트는 상대적 오프셋을 사용하여보다 간단한 코드를 허용하도록 정의되었습니다. 지시 집합의 관점에서 본질적으로 상대 주소 지정을 지원한다고 말할 수 있습니다. JVM이 실제로 실행을 구현하는 방법은 JVM에 달려 있습니다.
you mentioned the JVM’s native code generation 이후 JVM이 원시 코드를 생성 할 때 코드의 대상 주소를 알고 있으며 상대 주소 나 절대 주소를 자유롭게 사용할 수 있습니다.
위에서 언급 한 것처럼 위에서 설명한 모든 것은 하나의 프로세스 내에서 발생하므로 운영 체제가 가상 메모리를 사용하는 경우 운영 체제에서 적응할 수있는 논리적 주소로 표시됩니다. MMU를 통해. 이러한 개념은 서로 관련이 없습니다.
RELOCATABLE을 소개하여 발에서 질문을 촬영했습니다. 이것은 지금 시점에서 당신의 이해를 초월하는 독립적 인 개념입니다. –
@ BruceDavidWilner 내가 아는 한. 두 가지 유형의 주소 바인딩이있을 수 있습니다. 논리적이고 상대적이며 상대적입니다. 때로는 상대 주소와 변동 가능 주소 조건은 같은 의미로 사용됩니다. 그래서 그 용어를 사용했습니다. – zgulser
@ BruceDavidWilner하지만 당신의 의견에 동의합니다. Relocatable more는 아직 해결되지 않은 주소를 의미합니다 (그렇게 말한 경우). – zgulser