2016-10-05 10 views

답변

4

ELF 1.2 specifications은 파일의 특정 오프셋에있는 엔터티를 나타내며 종종 p_offset으로 표시되며 메모리의 특정 주소 (종종 p_vaddr으로 표시됨)에로드됩니다.

명세서에는 세그먼트의 정렬이 지정되어 있지 않습니다. 입니다.
그러나 그것은

로드 가능한 프로세스 세그먼트, p_vaddrp_offset에 대한 합동 값이 페이지 크기를 모듈로해야한다는 것을 요구한다.
이 멤버 [p_align]는 세그먼트가 메모리와 파일에 정렬되는 값을 제공합니다.
값 0과 1은 정렬이 필요 없음을 의미합니다. 그렇지 않은 경우 p_align은 양수이고, 누적 굴절도는 2이어야하며 p_addrp_offset, 모듈로 p_align과 같아야합니다.

용어는 제 의견으로 약간 벗어났습니다 (세그먼트는 일반적인 의미로 정렬되지 않았으므로 p_align의 배수로 시작하지 않음).

견적 뒤에있는 이론적 근거는 시스템이 세그먼트를 빠르게로드 할 수 있어야한다는 것입니다. 따라서로드 주소와 일치시키기 위해 메모리에서 해당 세그먼트를 이동하지 않아야합니다.

로드 할 때 파일은 페이지이라고하는 메모리의 하나의 "단위"로 구성됩니다.
페이지는 일반적으로 크기가 고정되어 있으므로 주소의 크기가 여러 개인 페이지부터 시작됩니다. 32 비트 x86 시스템의 경우
,이 크기는 4KiB하고, 페이지와 자신의 시작 주소의 다음 순서를 상상 :

Page 0 Page 1 Page 2 ... Page 4 ... Page 100 ... Page K 
    0  4096 8192  16384  409600  K*4096 

요점은 그 복사하지 않고, 매우 신속하게 페이지의 주소를 변경할 수 있습니다 모든 바이트는 이며 다시 매핑은입니다.
일단 파일이로드되면 OS는 각 세그먼트가 p_vaddr에 지정된 주소에 있도록 파일의 페이지를 다시 매핑합니다. 견적 및 p_align에 명시된 조건을 만족하지 않는 파일의 세그먼트의 시작은 4KiB의 배수가 아닌 경우

Sections loaded in memory

자,이 "트릭은"작동하지 않으며 OS가 필요 로드 된 세그먼트를 이동하는 것으로 되돌립니다.
작업을 쉽게하고 메모리를 낭비하지 않도록 세그먼트는 일반적으로 파일에서 4KB로 정렬됩니다.

+0

질문은 섹션 (4KiB 맞춤 요구 사항이 전혀없는 섹션)에 관한 것입니다. OP가 섹션과 세그먼트의 구분을 이해하는지 여부는 명확하지 않습니다. –