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