내 struct vm_area_struct *
의 pagefault 처리기를 사용하여 실제 페이지를 사용자 공간에 매핑하고 싶습니다. 여기페이지 폴트 핸들러를 사용하여 페이지를 매핑하는 방법은 무엇입니까?
내가 진행하는 방법입니다
- 나는 세계적으로 모듈을 초기화하는 동안
alloc_page(GFP_USER)
을 사용하여 페이지를 할당 (I 다양한 GFP를 시도했다). struct vm_area_struct
을 만들고 사용자 정의 페이지 오류 처리기를 설정하고vma
을current->mm
에 연결하십시오.
는 페이지 오류가 발생하는 경우 :
- 은 내가 이전에 할당 된 페이지로
vmf->page
를 설정하고 결과는vma
의 모든 가상 페이지를 매핑해야한다는 것입니다 0
을 반환 페이지 폴트 후 동일한 물리적 페이지로 내 커널 모듈에서 페이지를 쓸 때, 그것은 내 사용자 공간 프로그램에
- 을 반영 있어요 :
그러나 여기서 내가 주목하는 것이다.
- 내 사용자 공간에서 페이지에 쓸 때 커널 모듈에서 볼 수 없습니다.
- 내 전역 변수를 사용하는 대신 페이지를 가져 오기 위해 커널 모듈에서
get_user_pages
을 사용할 때 글로벌 페이지 변수와 다른 실제 주소를 얻습니다.page_to_phys(page)
을 사용하여 주소를 인쇄합니다. 이 페이지에 쓰기는 내 사용자 공간 프로그램에 반영됩니다.
이 모든 것은 페이지 폴트 처리기에서 수행됩니다.
어떻게이 이상한 행동을 설명 할 수 있습니까?
커널 공간에서 페이지에 액세스하려면 kmap_atomic
과 kunmap_atomic
을 사용하고 있습니다.