프로세스 p1에서 호출 할 커널 모듈을 작성하여 대상 프로세스 p2에 속한 데이터 페이지를 덮어 씁니다.커널 모듈은 한 프로세스에서 호출되는 동안 다른 프로세스의 페이지에 씁니다.
먼저 커널 모듈 내부에서 p1이 발행 한 proc 파일 시스템에 대한 쓰기 이벤트에 응답하는 동안. 나는 목표 프로세스 (p2)의 프로세스 ID를 사용하여 후자의 태스크 구조 (p2_task)를 검색했다.
특정 페이지를 검색하려면 get_user_pages()
을 사용하고 분명히 (p2_task->mm
)이라고합니다. 그런 다음 이전 함수에서 반환 한 페이지에서 kmap()
을 호출했습니다. 포인터를 얻은 후에는 메모리에 쓸 일반적인 메모리 함수 (memset()
)를 사용했습니다. 마지막으로 kunmap()
이라고합니다.
그러나 프로세스가 다시 실행되기 시작하면 대상 프로세스 p2에 아무런 영향을 미치지 않습니다.
내가 잘못했는지 잘 모르겠다. 누구든지 도와 줄 수 있습니까?
나는 p2에서 오는 요청에 응답하는 동안 어떻게 든 당신이 메모리 p2에 속해 있다고 쓸 수 없다고 생각한다. 여기부터 우리는 다른 상황에 처해 있습니다.
내가 확인할 수있는 것이 아니라면 사실인가요? 그것이 문제라면, 어쨌든 내가 그 문제를 해결할 수 있을까요?
나의 이해 물리적 페이지 :
당신이 값을 변경 한 후 P1이를 호출하십시오. 즉, 물리적 페이지가 이미 커널 공간의 가상 주소를 가지고 있다면'kmap()'이 그것을 리턴한다. 그렇지 않으면 동일한 물리적 페이지를 커널 공간 가상 주소로 다시 매핑 한 다음이 새 가상 주소를 반환합니다. 따라서 새로운 물리적 페이지가 필요하지 않습니다. 또한 새 가상 주소는 p2가 아닌 커널 공간 내에 만들어집니다. – hebbo모든 것이 커널 공간에서 이루어집니다. – hebbo
죄송합니다, p1이 p2를 덮어 쓰길 원했습니다. 이제는 다른 사용자 컨텍스트에서 호출되었다고 말하는 p1 만 언급했습니다. 위에서 설명한 내용을 수행하고있는 http://makelinux.net/ldd3/chp-15-sect-3을 참조하십시오. 내가 보는 유일한 차이점은 mmap_sem을 잡아서 놓고 SetPageDirty()를 호출하는 것입니다. –