2016-07-20 17 views
3

디바이스 랩핑 라이브러리 (Linux의 경우)의 효과적인 유닛 테스트를 수행하기 위해 C로 메모리 맵핑 된 디바이스를 모의하고 싶습니다.사용자 공간에서 C로 메모리 맵핑 된 디바이스 모방

이제 나는 상기 장치의 모의를 나타낼 수있는 사용자 공간으로 파일 설명자를 mmap 수 있습니다.

AFAICT, 제 질문은 다음과 같습니다. 사용자 공간에서 mmap이 작동하고 읽기 및 쓰기가 적절한 콜백으로 처리되는 파일 설명자를 만들 수 있습니까?

또는 아마도 이것이 해결 된 문제 일 수 있으며 알려진 커널 드라이버가있을 수 있습니까?

+0

리눅스, 아마? Apple 또는 Windows 커널 드라이버를 사용하지 않을 것을 고려하십시오. – MSalters

+0

mmap FUSE 파일 시스템 파일일까요? – Kornel

+0

@MSalters 네, 리눅스 - 사과 (정보를 편집했습니다). –

답변

2

Linux 시스템이므로 한 파일만으로 매우 간단한 FUSE 파일 시스템을 구현할 수 있습니다. 커널이 거기에서 처리 할 수 ​​있습니다.

주요 문제는 커널이 모든 쓰기를 플러시하지 않을 것으로 기대할 수 있다는 것입니다. 그래도 모든 미결 쓰기를 플러시 할 수있는 msync() 호출이 있지만 테스트중인 시스템이이를 호출하지 않습니다. 그러나, 나는 당신이 파일 디스크립터를 열어서 도망 갈 수 있다고 생각한다. O_DIRECT | O_DSYNC

+0

이 경우 사용자 정의 FUSE 파일 시스템에서 문제가 발생한다고 생각하십니까? –

+0

그래, 커널에 의해 페이지 캐시의 페이지가 더럽다고 써지게된다. FUSE 파일 시스템 드라이버는 diff를 계산하여 무엇이 변경되었는지 확인해야합니다. 쓰기 성공을 표시하면 커널은 페이지 캐시의 더티 비트를 다시 지 웁니다. 명백한 경고 : 동일한 메모리 주소를 다시 읽으면 동일한 결과가 나타납니다. FUSE 파일의 경우 '휘발성 (volatile)'과 일치하지 않습니다. – MSalters

+0

나는 '휘발성'에 대한 당신의 요지를 완전히 이해하지 못한다. 이것은 액세스 코드가 메모리를 '휘발성 (volatile)'으로 정의 했음에도 불구하고 OS가 작성한 것을 캐시한다는 것을 의미합니까? 이것은 접근법을 쓸모 없게하지 않습니까? –