2016-06-27 3 views
2

내가 추가 한 인터페이스 기능 중 하나가 alloc_contig(int order) 인 char 드라이버가 있습니다. 여기서 주문은 원하는 4KB 페이지 수의 log2입니다. 이 함수는 인접한 실제 메모리를 할당하고 remap_pfn_range 함수를 사용하여 사용자 공간 사용을 위해 매핑합니다. 이 메모리를 해제하는 함수를 작성하려고합니다. dealloc_contig(va) 커널에 가상 주소가 있습니다. 사용자가 무료로 제공하고 기본 물리적 주소를 가져와야하므로 virt_to_phys을 사용하려고했지만 그다지 제공하지 않습니다. 원하는 주소. 로그 :가상 논리 커널 주소

//allocating 
page address is ffff880868764000 //allocated using alloc_pages 
//deallocating 
virtual address from user 7f4c7e095000 
when converted to PA using virt_to_phys got f74c7e095000 instead of ffff880868764000 

도와 주실 수 있습니까?

답변

1

빠른 대답 : 당신은()은 사용자 프로세스에서 페이지 매핑을 해제 do_munmap을 사용해야합니다.
virt_to_phys()이 작업을 수행 할 수 없습니다. 커널에서 커널 가상 주소 (사용자 가상 주소가 아닌) 을 실제 주소로 변환하는 데 사용됩니다.

사용자 공간 메모리는 vma 영역 (구조체 vm_area_struct * vma)로 구성됩니다. 프로세스 단위로 struct mm_struct에서 찾을 수 있습니다. 프로세스 은 자신의 mm_structs를 가지기 때문에 다른 프로세스의 동일한 가상 주소가 다른 물리적 주소에 매핑됩니다.

당신이해야 할 일은 가상 주소를 얻는 것입니다. 그런 다음 커널 공간에서 이 주소가 속한 vma를 찾은 다음 vma에서 주소 범위 의 매핑을 해제하고 페이지를 회수해야합니다 (이것은 do_munmap()입니다).

프로세스의 고유 한 mm_struct, 즉 자체 vma 영역이 있으므로 언급해야 할 또 다른 포인트가 있습니다. do_munmap() 은 "올바른"사용자 프로세스 컨텍스트 아래에서 호출되어야합니다. 그렇지 않으면 잘못된 mm_struct가 반환됩니다. 최대

합계 단계 :
지역 통화 가상 주소를 해제하여 인터페이스를 매핑 한 1. 사용자 과정. 2. 커널 공간에 대한 시스템 호출 (이것은 사용자 프로세스의 컨텍스트하에 있습니다). 드라이버 핸들러가 에 do_munmap()을 호출하면 가상 주소의 매핑을 해제합니다.
3. 드라이버에서 페이지를 비우십시오.

희망이 있습니다.

+0

도움 주셔서 감사합니다. 가능한 경우, 적절한 vma 구조체를 찾는 방법을 안내해 주시겠습니까? 내가 보았 듯이, mm_strct에는 vmm 구조체를 포함하는 mm_rb라는 빨간색 검은 색 트리가 있습니다. 그러면 프로세스의 mm_struct에 어떻게 액세스합니까?이 트리에서 어떻게 검색합니까? –

+0

안녕하세요, 이것은 do_munmap() -> find_vma()에 의해 수행됩니다.이 링크에서 소스 코드를 볼 수 있습니다. http://lxr.free-electrons.com/source/mm/mmap.c#L2411 – Lin