여러 프로세스 간에 공유되는 메모리 매핑된 파일을 사용할 프로젝트를 생각 중입니다. 모든 프로세스에서 매핑된 영역의 포인터 값을 사용할 수 있으려면* 매핑되었는지 확인해야 합니다. to Each 각 프로세스의 기본 주소는 동일합니다. 물론 MAP_FIXED
to 태그를 사용하여 이 작업을 수행하는 것은 그 자체로 쉽지만 mmap()
어떤 주소를 선택해야 하는지가 문제입니다.
코드가 실행되기 시작하면 실행 파일과 해당 코드에서 사용하는 공유 라이브러리가 이미 메모리 위치에 매핑되어 있는 상황이 발생합니다. 이 주소의 대략적인 범위를 미리 알 수 있습니까? 많은 커널에서 기본적으로 ASLR이 켜져 있기 때문에 이 문제는 오늘날 특히 중요합니다. 나는 경험적으로 주 실행 파일에 대한 일부 느슨한 주소 범위와 공유 라이브러리에 대한 것으로 보이는 다른 범위가 있는 것으로 보았지만 실제로는 잘 정의되어 있습니까? 물론, 표준 문서가 있으면 좋겠지만 문제의 프로젝트는 실제로 혼자서만 실행할 수 있기 때문에 느슨한 디자인 철학도 좋을 것입니다.
기존 매핑이 어디에서 끝날지 미리 알 수 있는 방법이 실제로 없다면, 유용한 주소 범위에 대한 내 추측이 잘못된 것으로 판명될 경우를 대비해 적어도 우아하게 실패할 수 있는 방법이 있습니까? 일반적으로 mmap
이전의 기존 매핑은 새로 요청된 매핑으로 자동으로 덮어쓰여집니다. 나는 그것이 무엇이든 포함하면 실패 O_EXCL
하는 유사한 플래그를 원한다고 생각 mmap
하지만 이 효과나 유사한 것을 찾을 수 없습니다. 나는 /proc/self/maps
내가 의도한 매핑과 겹치는 것이 있는지 분석하고 확인할 수 있다고 생각했지만 으으으.
* 응, 나도 알아할 수 있다매핑된 영역에서 상대 포인터를 사용하지만 여러 가지 이유로 그렇게 하고 싶지 않습니다.