2011-08-06 8 views
1

프로세스와 해당 mm_struct에 대한 액세스 권한이 있다고해서 매핑 중 하나를 변경하거나 매핑을 제거하고 임시 테이블을 만들 수있는 방법이 있습니까? 페이지보다 작은 금액을 할당하고 메모리에 기록 할 수 있습니까?리눅스 커널의 사용자 프로세스에 대한 페이지 맵핑 변경하기

예를 들어, ADD 명령에서 쓰기 오류를 처리하십시오. 나는 상대적으로 쉽게 오류의 주소와 크기를 얻을 수있다. 로컬로 8 바이트 (가장 큰 단일 명령 크기)를 할당하고 오류가있는 가상 주소가 해당 8 바이트의 첫 번째 바이트를 가리 키도록 매핑을 엉망으로 만듭니다. 그런 다음 다른 페이지를위한 데이터를 가져온 다음 원래 페이지를 다시 매핑으로 복원하라는 지시를 한 단계 씩 수행합니다. 프로세스의 가상 메모리 영역에서 페이지가 아닌 다른 것을 사용할 수 있는지 궁금합니다.

답변

2

컴퓨터의 기본 아키텍처는 가상 메모리로 수행 할 수있는 작업과 수행 할 수없는 작업을 정의합니다. 아키텍처를 지정하지 않았지만 페이지보다는 작은 단위를 관리 할 수 ​​없다고 확신합니다.

그러나 더 큰 문제를 해결하려면 메모리 크기가 중요한 이유는 무엇입니까? 이 할당은 스레드에 한 번만 필요하며 오류가있는 경우에만 할당해야하며 단일 사용자 공간 명령어에 할당됩니다. 새롭고 깨끗한 페이지를 사용하여 프로세스에 임시로 매핑하여 서면 가치를 얻으십시오. 아마도 작성하기가 쉽고 보안 성도 뛰어납니다. 커널 데이터를 신뢰할 수없는 (분명히 결함이있는) 응용 프로그램에 노출시키지 않습니다.

+0

메모리 오버 헤드가 그리 크지 않기 때문에 사실입니다. 페이지 크기는 처음 8 바이트 만 사용 하긴하지만 4,8k 정도입니다. sidenote로서, (커널 공간에서) 사용자 공간 명령을 단일 단계로 진행하는 가장 쉬운 방법을 알고 계신가요? –

+0

@Jesus : 정확하게 모르겠지만 [ptrace()'] (http://linux.die.net/man/2/ptrace)에서 사용 된 코드를 살펴보고 ' PTRACE_SINGLESTEP' 요청입니다. – Karmastan