2012-04-04 2 views
3

iOS 또는 OSX의 프레임 워크에서 mmap()이 어떻게 작동하는지 조금 혼란 스럽습니다.mmap'ed 데이터가 객체 할당과 어떻게 작동합니까?

파일이 mmap()을 사용하여 가상 메모리에 매핑되고 데이터가 요청되면 커널에서 데이터를 RAM으로 페이지합니다. 이것이 실제로 객체를 만드는 방법에 실제로 어떤 영향을 줍니까?

보통 alloc/init을 사용하여 개체를 만드는 경우 메모리 블록이 할당되고 개체가 시작됩니다. 그러나 데이터가 mmap '파일의 가상 메모리에 상주하면 어떻게 될까요? alloc을 개체에서 호출해야합니까? 개체에 할당 된 메모리가 가상 메모리의 데이터로 채워 집니까? 또는 alloc 호출을 건너 뛰고 가상 메모리의 데이터 포인터를 전달하기 만합니까?

이미지 또는 사운드 파일, 파일이 가상 메모리에있는 위치를 알고있는 경우 개체를 어떻게 설정합니까?

데이터를 할당하는 경우 데이터가 RAM에 이미 페이징 된 경우 중복되지 않습니까?

가상 주소의 메모리를 사용하면 힙에 할당 할 필요가 없다고 생각했습니다.

답변

1

mmaped 공간에 저장하는 객체가 하나 뿐인 경우 alloc을 건너 뛰고 위치를 직접 사용하십시오. 그러나 일반적으로 하나 이상의 개체가 있으며 이제는 직접 관리해야합니다. 일반적으로 적어도 일부분은 고정 된 방식으로 배치되어 두 프로세스가 어디에서 사물을 찾을 수 있는지 알 수 있습니다. 포인터 대신에 경기장의 시작에서 오프셋을 사용하는 즐거움을 얻습니다. 이는 두 프로세스의 주소 공간에서 모두 작동하기 때문입니다.

본질적으로 하나의 큰 malloc/alloc을 수행하고 마치 그 안에서 놀아 다닌 것처럼 당신은 많은 양의 메모리를 받게됩니다.

당신이 가지고있는 경우,

void *p = mmap(<appropriate arguments>); 

말을 당신은 200 오프셋 타입 foo는의 객체를 데려 가고 싶다는, 당신은

foo *f = (foo *)p+200; 

을 말할 것입니다 그리고 지금 당신은 모든 정상에 F를 조작 할 수 있습니다 방법은 mmap 된 공간에 포인터가 들어 있지 않은 f를 조건으로합니다. 일반적으로 그러한 포인터에 대한 대체 값을 대입하는 것이 좋은 규율이며, 그 다음에 포인터를 따라야하는 경우 p로 포인터를 변환 할 수 있습니다.

+0

예, 오프셋이 사용되고 오프셋이 알려져 있고 올바른 데이터가 객체로 처리되는 경우 alloc을 건너 뛸 수 있는지 확인하고 싶었습니다. 예 : UIImage, mmap'ed 인 알려진 데이터에서 init 호출 – user773578

+0

확인되었습니다. 오프셋을 알고 나면 그 위치에 대한 포인터를 객체 유형에 대한 포인터로 캐스트 할 수 있습니다. – DRVic

+0

감사합니다. 그렇다면 VM 데이터에 어떻게 액세스합니까? 알려진 데이터의 오프셋과 크기를 전달합니까? UIImage 예제를 사용하면 오프셋 500이 이미지로 알려져 있고 특정 크기 인 경우 시스템에 일정량의 데이터 만 가져 와서 이미지로 처리하도록 시스템에 지시하는 방법은 무엇입니까? – user773578

관련 문제