특정 프로세스의 메모리에 액세스 할 수있는 커널 모듈을 작성 중입니다.커널 모듈에서 사용자 공간 메모리 보호 플래그를 변경하십시오.
#define MAP_FLAGS (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS)
prot = PROT_WRITE;
retval = do_mmap(NULL, vaddr, vsize, prot, MAP_FLAGS, 0);
vaddr
및 vsize
가 이전 설정하고, 호출이 성공 : 나는 do_mmap()
와 사용자 공간 메모리의 일부에 익명의 매핑을 수행했다. 커널 모듈 (copy_to_user
경유)에서 그 메모리 블럭에 쓰기를 한 후에, 정상적인 사용자 공간에서 mprotect
처럼 나는 그것에 대한 PROT_WRITE
허가를 제거하고 싶다. 나는 이것을 허용 할 함수를 찾을 수없는 것 같다.
영역의 매핑을 해제하고 올바른 보호 기능을 사용하여 매핑하려고 시도했지만 메모리 블록을 초기화하여 방금 쓴 모든 데이터를 지 웁니다. MAP_UNINITIALIZED
을 설정하면 man 페이지에서, 그 문제를 해결하지만, 수 있습니다
MAP_UNINITIALIZED을
(리눅스 2.6.33 이후) 명확하지 익명 페이지를 수행합니다. 이 플래그는 내장 된 기기의 성능을 향상시키기위한 것입니다. 이 플래그는 커널이 CONFIG_MMAP_ALLOW_UNINITIALIZED 옵션으로 구성된 경우에만 적용됩니다. 보안 의미가 있기 때문에 보통 옵션은 내장 된 장치 (즉, 사용자 메모리의 내용을 전체 로 제어하는 장치)에서만 사용할 수 있습니다.
그래서 내가 원하는대로 할 수는 있지만 매우 휴대 할 수는 없습니다. 제가 제안한 것을 성취 할 수있는 표준 방법이 있습니까?
왜 왜 커널 모듈에서 모든 작업을 수행하고 있습니까? 산뜻하게 정의 된 API를 사용하면 사용자 공간 프로세스 자체로는 수행 할 수없는 이유가 없습니다. – mpe
@mpe 사용자 공간에서 할 수없는 이유는 내가 작성한 모듈이 프로세스 로더라는 것입니다. 사용자 공간 코드에 영향을주지 않습니다. – nosuchthingasstars
프로세스 로더 란 무엇입니까? binfmt 핸들러를 의미합니까? – mpe