로드 시 ELF 파일의 모든 코드와 데이터에 RAM을 할당할 수 있습니까?

로드 시 ELF 파일의 모든 코드와 데이터에 RAM을 할당할 수 있습니까?

Linux에서는 페이지의 가상 주소가 참조될 때까지 가상 주소 공간 페이지에 RAM 페이지가 할당되지 않는다는 것을 알고 있습니다. 그러나 나는 로드되기 전에 모든 ELF 파일이 이미 RAM(RAM 디스크)에 있는 장치에서 임베디드 Linux를 사용하고 있습니다(프로세스는 각 ELF 파일에서 시작됩니다). 그래서 각 ELF 파일이 로드될 때 모든 코드와 데이터에 대해 RAM을 할당할 수 있는지 궁금했습니다. 가능하다면 나중에 사용할 수 있도록 더 많은 메모리 공간을 확보하기 위해 모든 ELF 파일의 코드와 데이터가 RAM에 페이징된 후 RAM에서 각 ELF 파일을 삭제할 수 있기를 바랍니다.

답변1

mlockall()) 와 같은 트릭을 사용하여 모든 프로세스의 주소 공간을

당신이 찾고 있는 것은제자리에서 실행(XIP)그리고 먼저 (별도의) RAM에 파일을 복사하는 대신 메모리 매핑된 저장소에서 직접 파일을 실행할 수 있는 기능입니다.

XIP는 실행 파일이 저장소(해당되는 경우 파일 시스템)에 배치되는 방식에 대해 엄격한 요구 사항을 부과하기 때문에 지원하기 어렵습니다. 예를 들어, 메모리에 매핑될 파일 부분은 스토리지에서 페이지 정렬되어야 하며 파일 시스템 메타데이터와 혼합될 수 없습니다. 또한 이상적으로 바이너리는 다음과 같이 컴파일됩니다.위치 독립적 코드이렇게 하면 런타임 링커가 매핑 후에 그 일부를 수정할 필요가 없습니다. XIP를 지원하는 파일 시스템은 거의 없습니다.

다행히 내 이해는임시 파일 시스템 하다XIP를 지원합니다. 이것이 맞다면 해결책은 tmpfs 파일 시스템을 마운트하고 실행하기 전에 실행 파일을 그곳으로 옮기는 것입니다.


고쳐 쓰다뒤쪽에Little Cowie가 댓글을 달았습니다.:

실행 파일을 tmpfs로 옮기면 자동으로 실행됩니까? 왜? RAM에서 파일 페이지를 정렬하는 방법은 무엇입니까? 로더는 실행 파일 로드를 시작할 때마다 실행 파일이 XIP 모드에서 실행하는 데 필요한 조건을 충족하는지 확인합니까?

tmpfs는 RAM에 파일을 저장하는 방식 때문에 XiP를 지원할 수 있습니다. tmpfs의 파일은 메모리 페이지에 저장되며 각 파일에는 tmpfs의 다른 파일과 공유되지 않는 전체 메모리 페이지 세트가 할당됩니다. (이것이 tmpfs의 파일이 항상 4KiB(페이지 크기)의 배수를 차지하는 이유입니다.) 데이터는 파일의 첫 번째 바이트, 메모리 페이지의 첫 번째 바이트 등에 저장됩니다. 따라서 mmap()호출(또는 커널 ELF 로더)이 파일의 페이지를 매핑할 때 데이터를 새 페이지에 복사할 필요가 없으며 매핑이 정렬되는 한 이미 tmpfs에 속한 페이지를 공유할 뿐입니다. (ELF의 경우도 마찬가지입니다).

관련 정보