나는 (적어도 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이 일부 하드웨어 요구 사항이 아니라 다른 고려 사항에서 파생되었음을 나타내는 경향이 있습니다.