2016-11-10 9 views
0

나는 메모리 할당이 프로그램의 컴파일과 로딩의 다른 단계에서 어떻게 작동하는지 이해하려고 노력하고있다.메모리 주소 : Linker Vs. 로더

1) 컴파일러와 어셈블러 어드레스 0

2) 링커는 각각의 심볼 정의를 갖는 메모리 위치 를 연결하고 모든 참조를 수정하여 다음과 같은 섹션으로 재배치 시작 코드 및 데이터 섹션을 생성 그 기호들로 하여금이 기억 장소를 가리 키도록하십시오.

3) 프로세스의 컨텍스트에서 로더가 프로그램을 주 메모리에로드하고
이므로 페이징 및 모든 메모리 관리 관련 작업이 수행됩니다. 로더에 의해 할당 된 것과 관련 링커에 의해 할당 된 주소입니다 어떻게

1) :

내 질문에 대해 두 가지입니다. 링커 주소 가상 주소를 호출 할 수 있습니까?

2) 모든 프로그램은 결국 서로 다른 물리적 주소에 매핑되는 동일한 가상 주소를 (해야합니까?)

답변

0

는 일반적으로 특정 주소에서 시작되지 않습니다 재배치 코드를 생성하는. 그것이 전적으로 가능하지 않은 경우가 있습니다. 예 :

int x ; 
int *y = &x ; 

이러한 특수 처리가 필요합니다.

링커는 컴파일러에서 참조하는 프로그램 섹션을 병합합니다. 링크의 출력은 로더에게 프로그램을 메모리에 배치하는 방법을 지시하는 프로그램입니다. 그 지시 사항은 위의 경우를 처리합니다.

로더는 링커의 지시 사항을 따릅니다.

1) 링커에서 할당 한 주소는 로더에서 할당 한 주소와 어떤 관련이 있습니까? 링커 주소 가상 주소를 호출 할 수 있습니까?

컴파일러 또는 어셈블리가 재배치 할 수없는 것을 생성하지 않는 한 일반적으로 링커는 재배치 가능 코드를 생성합니다. 링커는 가상 주소를 생성하지 않습니다.

2) 모든 프로그램은 결국 서로 다른 물리적 주소에 매핑되는 동일한 가상 주소를 (해야합니까?) 대부분의 시스템에서

은, 프로그램의 각 실행은 동일한 논리 주소 레이아웃을 생성합니다. 보안 조치로서이 경우가 아니라는 것이 더 일반적이되고 있습니다. 프로그램이로드 될 때마다 다르게로드됩니다.