이 질문은 완전히 하드웨어 및 OS에 의존하기 때문에 일반적으로 대답 할 수 없습니다. 그러나 일반적인 대답은 처음에로드 된 프로그램을 컴파일 할 수 있다는 것입니다. VM 하드웨어가 각 프로그램에 자체 주소 공간을 제공하기 때문에 프로그램 링크시 모든 주소를 고정시킬 수 있습니다. 로드 할 때 주소를 다시 계산할 필요가 없습니다.
처음로드 된 동일한 프로그램에서 사용되는 두 개가 동일한 기본 주소로 컴파일되어 주소 공간이 겹치기 때문에 동적으로로드 된 라이브러리에서 더욱 흥미로운 점이 있습니다.
이 문제에 대한 한 가지 방법은 DLL에 위치 독립적 코드가 필요하다는 것입니다. 이러한 코드에서 모든 주소는 코드 자체와 관련됩니다. 점프는 일반적으로 PC와 관련이 있습니다 (코드 세그먼트 레지스터를 사용할 수도 있음). 데이터는 또한 일부 데이터 세그먼트 또는 기본 레지스터와 관련이 있습니다. 런타임 위치를 선택하려면 PIC 코드 자체가 변경 될 필요가 없습니다. 세그먼트 또는 기본 레지스터 만 모든 DLL 루틴의 서곡에서 설정해야합니다.
추가 주소 계산이 있고 PC 및/또는 기본 레지스터가 프로세서의 명령 파이프 라인에 병목을 일으킬 수 있기 때문에 PIC는 위치 종속 코드보다 약간 느려지는 경향이 있습니다.
그래서 다른 방법은 로더가 주소 공간 오버랩을 제거하기 위해 필요한 경우 DLL 코드를 리베이스하는 것입니다. 이를 위해 DLL에는 코드의 모든 절대 주소 테이블이 있어야합니다. 로더는 가정 된 코드와 실제 주소 사이의 오프셋을 계산하고 실제 값을 계산 한 다음 테이블을 탐색하여 프로그램이 VM에 복사 될 때 각 절대 주소에 오프셋을 더합니다.
DLL에는 호출 프로그램이 라이브러리 프로 시저가 시작되는 위치를 알 수 있도록 진입 점 테이블이 있습니다. 또한 조정해야합니다.
리베이스는 성능면에서 좋지 않습니다. 로드 속도가 느려집니다. 또한, 그것은 DLL 코드의 공유를 패배시킵니다. 리베이스 오프셋 당 적어도 하나의 사본이 필요합니다.
이러한 이유로 Windows의 일부인 DLL은 중첩되지 않는 VM 주소 공간으로 고의적으로 컴파일됩니다. 로딩 속도가 빨라지고 공유가 가능합니다. C 런타임 라이브러리와 같은 MS DLL이 빠르게로드되는 반면 타사 DLL이 디스크를 크 런치하고 느리게로드되는 것을 확인한 경우 Windows에서 리베이스의 효과가 나타납니다.
이 항목에 대한 자세한 내용은 개체 파일 형식을 참조하십시오. Here is one example.
http://en.wikipedia.org/wiki/Memory_management_unit – Thomas
"상대적으로 점프"라는 개념을 이해하고 있습니까? – Floris
프로그래밍 질문이 아닌 OS 디자인 질문처럼 들립니다. 응답은 주소 공간이 가상이기 때문에 프로그램이 원하는만큼 정확하게로드된다는 것을 알 수 있습니다. 가상 어드레싱의 마법입니다. –