사용자 공간의 텍스트 세그먼트를 0x8048000부터 시작하게 만드는 기본 원리

사용자 공간의 텍스트 세그먼트를 0x8048000부터 시작하게 만드는 기본 원리

나는 모든 사용자 공간 코드가 로드 주소 0x8048000의 가상 메모리 주소 공간에 배치되어 있다는 어딘가(적어도 Linux v. 2.6 기준)를 읽었습니다.

내 자신의 관찰이 이것을 확인합니다. 내가 하나 만들었어

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도 예외는 아니기 때문에 이는 그 자체로 이상합니다.

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

관련 정보