리눅스에서는 mmap
을 사용하여 프로세스의 가상 주소 공간에 매핑을 생성 할 수 있습니다. 사용 사례 중 하나가 매우 큰 파일 작업입니다. 안타깝게도 이미 연속적으로 시작된 무언가에 대해서만 매핑을 생성 할 수 있습니다. offset
과 length
중 하나만 받아들입니다.userland에서 세그먼트 화 된 메모리에서 매핑을 만드는 방법은 무엇입니까?
메모리의 여러 세그먼트를 하나의 인접한 주소 범위에 매핑하는 솔루션을 찾고 있습니다. 이 사용자는 실제로 디스크에서 조각난 파일에 대한 연속 주소 범위를 표시하려는 사용자 공간에서 실행되는 NTFS 드라이버입니다. 필자가 알기에 이것은 커널에서 작동하는 드라이버에서 가능하지만 사용자 공간에서 특별히 해결책을 찾고 있습니다.
솔루션은 C/C++이어야합니다. 커널 버전과 관련된 요구 사항이 없습니다. 지금까지 제가 생각해 낼 수있는 최선의 방법은 세그먼트에서 세그먼트로 점프하는 방법을 알고있는 반복기를 작성하는 것뿐입니다.하지만 문자 배열 만 허용하는 라이브러리와도 인터페이스하고 싶습니다.
나는 이것이 내 질문에 대해 알기를 바랍니다. 어떤 조언을 환영합니다!
빠른 응답을 보내 주셔서 감사합니다. 매뉴얼 페이지는 "MAP_FIXED - addr을 힌트로 해석하지 말라. 매핑을 정확히 그 주소에 놓는다. _addr은 페이지 크기의 배수 여야한다 ._". 따라서 원하는 주소를 자유롭게 붙일 수는없는 것 같습니다. 또는 초기 mmap이 만들어지면 더 이상 적용되지 않습니까? – delins
@delins : 'offset'도 페이지 크기의 배수 여야합니다. 기본적으로 모든 것은 페이지 크기의 배수 여야합니다. 이것은 프로세서에서 MMU가 작동하는 방식을 나타냅니다. 따라서 'mmap'을 사용하면 주소가 페이지 크기의 배수 인 경우 원하는 주소를 붙일 수 있습니다. –
그건 불행한 일입니다. 개별 세그먼트는 페이지 크기 (이론적 최소 1 바이트)보다 작은 크기를 포함하여 모든 크기를 가질 수 있습니다. 상관없이 좋은 생각이야! – delins