2014-12-05 1 views
1

struct vm_area_struct *의 pagefault 처리기를 사용하여 실제 페이지를 사용자 공간에 매핑하고 싶습니다. 여기페이지 폴트 핸들러를 사용하여 페이지를 매핑하는 방법은 무엇입니까?

내가 진행하는 방법입니다

  • 나는 세계적으로 모듈을 초기화하는 동안 alloc_page(GFP_USER)을 사용하여 페이지를 할당 (I 다양한 GFP를 시도했다).
  • struct vm_area_struct을 만들고 사용자 정의 페이지 오류 처리기를 설정하고 vmacurrent->mm에 연결하십시오.

는 페이지 오류가 발생하는 경우 :

  • 은 내가 이전에 할당 된 페이지로 vmf->page를 설정하고 결과는 vma의 모든 가상 페이지를 매핑해야한다는 것입니다 0

을 반환 페이지 폴트 후 동일한 물리적 페이지로 내 커널 모듈에서 페이지를 쓸 때, 그것은 내 사용자 공간 프로그램에

  • 을 반영 있어요 :

    그러나 여기서 내가 주목하는 것이다.

  • 내 사용자 공간에서 페이지에 쓸 때 커널 모듈에서 볼 수 없습니다.
  • 내 전역 변수를 사용하는 대신 페이지를 가져 오기 위해 커널 모듈에서 get_user_pages을 사용할 때 글로벌 페이지 변수와 다른 실제 주소를 얻습니다. page_to_phys(page)을 사용하여 주소를 인쇄합니다. 이 페이지에 쓰기는 내 사용자 공간 프로그램에 반영됩니다.

이 모든 것은 페이지 폴트 처리기에서 수행됩니다.

어떻게이 이상한 행동을 설명 할 수 있습니까?

커널 공간에서 페이지에 액세스하려면 kmap_atomickunmap_atomic을 사용하고 있습니다.

답변

1

이것은 쓰기 중 복사 메커니즘 때문입니다. 페이지 폴트 처리기가 실행 된 후 vmf->page에 반환 한 페이지가 새로 할당 된 페이지에 복사됩니다. 이것이 사용자 공간의 변경 사항이 커널 모듈에 반영되지 않은 이유입니다. 커널에서 읽으려고 한 페이지가 사용자 공간 프로세스에 실제로 매핑 된 페이지가 아닙니다.

do_cow_fault 함수는 mm/memory.c에서 참조 할 수 있습니다.

관련 문제