내가 추가 한 인터페이스 기능 중 하나가 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
도와 주실 수 있습니까?
도움 주셔서 감사합니다. 가능한 경우, 적절한 vma 구조체를 찾는 방법을 안내해 주시겠습니까? 내가 보았 듯이, mm_strct에는 vmm 구조체를 포함하는 mm_rb라는 빨간색 검은 색 트리가 있습니다. 그러면 프로세스의 mm_struct에 어떻게 액세스합니까?이 트리에서 어떻게 검색합니까? –
안녕하세요, 이것은 do_munmap() -> find_vma()에 의해 수행됩니다.이 링크에서 소스 코드를 볼 수 있습니다. http://lxr.free-electrons.com/source/mm/mmap.c#L2411 – Lin