7

프로세스 p1에서 호출 할 커널 모듈을 작성하여 대상 프로세스 p2에 속한 데이터 페이지를 덮어 씁니다.커널 모듈은 한 프로세스에서 호출되는 동안 다른 프로세스의 페이지에 씁니다.

먼저 커널 모듈 내부에서 p1이 발행 한 proc 파일 시스템에 대한 쓰기 이벤트에 응답하는 동안. 나는 목표 프로세스 (p2)의 프로세스 ID를 사용하여 후자의 태스크 구조 (p2_task)를 검색했다.

특정 페이지를 검색하려면 get_user_pages()을 사용하고 분명히 (p2_task->mm)이라고합니다. 그런 다음 이전 함수에서 반환 한 페이지에서 kmap()을 호출했습니다. 포인터를 얻은 후에는 메모리에 쓸 일반적인 메모리 함수 (memset())를 사용했습니다. 마지막으로 kunmap()이라고합니다.

그러나 프로세스가 다시 실행되기 시작하면 대상 프로세스 p2에 아무런 영향을 미치지 않습니다.

내가 잘못했는지 잘 모르겠다. 누구든지 도와 줄 수 있습니까?

나는 p2에서 오는 요청에 응답하는 동안 어떻게 든 당신이 메모리 p2에 속해 있다고 쓸 수 없다고 생각한다. 여기부터 우리는 다른 상황에 처해 있습니다.

내가 확인할 수있는 것이 아니라면 사실인가요? 그것이 문제라면, 어쨌든 내가 그 문제를 해결할 수 있을까요?

+1

나의 이해 물리적 페이지 :

당신이 값을 변경 한 후 P1이를 호출하십시오. 즉, 물리적 페이지가 이미 커널 공간의 가상 주소를 가지고 있다면'kmap()'이 그것을 리턴한다. 그렇지 않으면 동일한 물리적 페이지를 커널 공간 가상 주소로 다시 매핑 한 다음이 새 가상 주소를 반환합니다. 따라서 새로운 물리적 페이지가 필요하지 않습니다. 또한 새 가상 주소는 p2가 아닌 커널 공간 내에 만들어집니다. – hebbo

+0

모든 것이 커널 공간에서 이루어집니다. – hebbo

+0

죄송합니다, p1이 p2를 덮어 쓰길 원했습니다. 이제는 다른 사용자 컨텍스트에서 호출되었다고 말하는 p1 만 언급했습니다. 위에서 설명한 내용을 수행하고있는 http://makelinux.net/ldd3/chp-15-sect-3을 참조하십시오. 내가 보는 유일한 차이점은 mmap_sem을 잡아서 놓고 SetPageDirty()를 호출하는 것입니다. –

답변

0

아마도 쓰려고하는 페이지가 읽기 전용입니까? 인텔 아키텍처에서 쓰기 보호를 설정할 수 있습니다.

0

소리가 TLB 문제와 유사하므로 P2에 하드웨어에 캐시 된 데이터의 가상 주소가 있습니다. p2가 값을 변경하기 전에 p2가 이전에 주소 공간에서 페이지를 읽거나 쓰지 않았습니까? `만든 kmap()`(낮은 MEM에서) 가상 주소를 반환 flush_tlb_page(struct vm_area_struct * vma, unsigned long address)