2012-03-21 3 views
5

mmap 작동 방법을 이해하려고합니다. mmap의 사용자 수준 호출은 다음과 같습니다. 나는 또한 소스 코드를보고mmap 사용자 호출과 mmap 커널 호출 사이의 연결

int <device_name>_mmap(struct file*fp, struct vm_area_struct *vma) 

하지만 난 사이에서 연결을 찾을 수 없습니다 이니 같은 특정 장치 드라이버에 대한

void *mmap(void *addr, size_t len, int prot, int flags, 
     int fildes, off_t off); 

하지만 커널 레벨의 mmap 보인다.

특정 장치에 대한 mmap은 "struct vm_area_struct * vma"인수를 어떻게 받습니까? 이해해 주시겠습니까? 당신의 도움을 주셔서 감사합니다.

+0

실제로 접속을 찾을 수는 없지만 연결을 찾을 수 없습니다. – vindyz

+0

'vm_area_struct'는 사용자 프로세스에 맵핑 될 가상 주소 범위와 어플리케이션이 맵핑하려는 디바이스의 오프 B에 대한 정보를 포함합니다. 'file' 인수는 사용자 측의 파일 기술자에 대응합니다. –

+0

최소한의 실행 가능한 커널 모듈 예제 : https://stackoverflow.com/questions/10760479/how-to-mmap-a-linux-kernel-buffer-to-user-space/45645732#45645732 –

답변

12

mmap()mmap() 라이브러리 호출은 오프셋 (offset)을 바이트 단위로 페이지 단위로 변환 한 libc로 구현 한 다음 mmap_pgoff() 시스템 호출을 호출합니다.

mmap_pgoff() 시스템 호출은 파일 설명자 인수에 해당하는 struct file *을 가져오고 do_mmap_pgoff()을 호출합니다.

do_mmap_pgoff()은 힌트와 사용 가능한 주소 공간을 기반으로 사용될 실제 주소와 길이를 계산하고 제공된 플래그를 VM 플래그로 변환하며 매핑을 수행 할 권한을 테스트합니다. 그런 다음 mmap_region()으로 전화합니다.

mmap_region(), 새로운 맵핑에 의해 대체되는 영역에 사전 맵핑을 제거 메모리 과금을 수행하고, 상기 어드레스 공간의 영역을 설명하는 새로운 struct vm_area_struct (이의 어드레스, 길이, 오프셋 및 VM 플래그를 캡슐화 매핑되는 작성 매핑). 그런 다음 파일의 ->mmap() 구현을 호출하고 struct file *struct vm_area_struct *을 전달합니다. 장치 파일의 경우이 장치의 mmap 구현 함수에 대한 호출이됩니다.

+0

매우 잘 설명되어 있습니다. 다른 커널 기능에 대한 설명은 어디에서 찾을 수 있습니까? 소스 코드 외에 참조할만한 것이 있습니까? – vindyz

+0

@vayay : 소스 코드를 읽는 연습 만하면된다고 생각합니다. 그리 어렵지 않습니다. [lxr.linux.no] (http://lxr.linux.no/)는 소스를 추적하는 데 적합합니다. syscall 진입 점에 대해서는'SYSCALL_DEFINE'을 찾으십시오. – caf

+0

@caf - 따라서 디스크에 저장된 텍스트 파일의 경우 파일 -> mmap() 구현이 파일 시스템에 의해 수행된다고 추측하는 것이 맞습니까? 예를 들어, 디스크에 저장된 파일 (ext4로 포맷 된 파일)이 mmaped되면 ext4 mmap 구현체가 mmap_region()에 의해 호출됩니다. – bornfree