사용자 공간 텍스트 세그먼트를 0x8048000에서 시작하도록 만드는 이론적 근거

사용자 공간 텍스트 세그먼트를 0x8048000에서 시작하도록 만드는 이론적 근거

나는 (적어도 Linux v. 2.6 이후로) 모든 사용자 공간 코드가 가상 메모리 주소 공간의 로드 주소 0x8048000에 배치된다는 것을 어딘가에서 읽었습니다.

내 자신의 관찰이 이것을 확인합니다. 나는 한 일을했다

cat /proc/......../maps

여러 프로세스의 경우 프로세스의 첫 번째 섹션' 프로그램은 text항상 '0x8048000'에서 시작됩니다.

게다가 C 라이브러리 시작 코드와 기타 모든 런타임 기능은 모두 이 기본값 뒤에 매핑되는 것 같습니다.

이는 거의 128M의 주소 공간을 구성하며, 0xC0000000 - 0x8048000이 여전히 사용자 공간에 대한 거의 3G의 주소 공간이라는 점을 고려하면 그리 많지 않습니다.

그래서 내 질문은 왜?

우리는 가상 주소를 다루고 있으며, VM 작동 방식의 정의에 따라 다른 프로그램과의 간섭이나 중복은 제외됩니다.

0x00000000 ~ 0x8048000 범위에 고정/기본 매핑이 있습니까?

기본 시작 주소가 페이지 경계에 있다는 사실 외에도 다른 값과 달리 이 숫자를 선택한 이유는 무엇입니까?

답변1

나는 다음이 좋은 대답이 아니라는 것을 인정하지만 0x8048000 값이ELF 사양. 해당 문서의 그림 A.4, A.5 및 A.6을 참조하세요. 그만큼System V ABI Intel 386 아키텍처 보충 자료또한 0x8048000으로 표준화됩니다. 3-22페이지, 그림 3-25를 참조하십시오. 0x804800은 낮은 텍스트 세그먼트 주소/높은 스택 주소로 규정됩니다. 스택은 일반적으로 프로세스 메모리 공간의 상위 주소에 설정되고 Linux도 예외는 아니기 때문에 이는 그 자체로 이상합니다.

ld커널이 ELF 실행 파일을 다소 낮거나 높은 주소에 매핑하도록 GNU 링커를 사용하여 ELF 실행 파일을 설정할 수 있습니다 . 이를 수행하는 방법은 GCC 및 ld 버전마다 다르므로 매뉴얼 페이지를 주의 깊게 읽으십시오. 이는 0x8048000이 일부 하드웨어 요구 사항이 아니라 다른 고려 사항에서 파생되었음을 나타내는 경향이 있습니다.

관련 정보