2011-05-05 6 views
3
나는 우리가 다시 제어를 제공하기 전에 우리가 유도 장애를 커널/ 사용자 모드에/ 예외 우리의 페이지 결함 핸들러 처리기를 추가하고 처리 할 수 ​​있는지 이해하려고 노력하고

커널에. 작업은 여기에 기존 커널 코드 ( FN do_page_fault)를 수정하지만 페이지 오류 또는 예외가 "같은 도구를 찾을 수 사용자 정의 페이지 오류 및 예외 핸들러

트리거 될 때 고개를 사용할 사용자 정의 핸들러를 추가하지됩니다 kprobe "이 지침에서 후크를 제공하지만이 모양은 내 용도로 사용되지 않습니다.

누군가가 나를 이해하는 데 도움이되거나 좋은 참고서를 가리키면 도움이 될 것입니다.

답변

0

우선 페이지 폴트 처리기는 가상 메모리 서브 시스템 구조에 직접 액세스해야하는 복잡한 기능입니다.

둘째, 사용자 공간에 페이지 오류 처리기를 작성하려면 기본적으로 커널 공간으로 강제 전송되는 오류를 캡처 할 수 있어야하므로 문제가되지 않는다고 가정합니다. 이것이 일어나지 않도록하십시오.

이 목적으로 모든 메모리 액세스를 추적하려면 관리자가 필요하지만 관리자 코드가 이미 매핑되어 메모리에 존재한다는 것을 보장 할 수 없습니다.

2

사용자 공간에서 SIGSEGV에 대한 신호 처리기를 정의 할 수 있으므로 유효하지 않은 메모리 액세스가 발생할 때마다 사용자 고유의 기능이 호출됩니다. mprotect()과 함께 사용하면 프로그램에서 사용자 공간의 모든 가상 메모리를 관리 할 수 ​​있습니다.

그러나, 나는 당신이 (주요 미성년자 무효) 모든 페이지 오류를 차단하고 응답 임의 커널 함수를 호출하는 방법을 찾고있는 인상을 얻을. 나는 이것을하기위한 깨끗한 방법을 모른다. 내 자신의 연구 프로젝트에서이 기능이 필요할 때 do_page_fault() 코드를 추가했습니다. 그것은 잘 작동하지만 해킹입니다. 누군가가이를 수행 할 수있는 깨끗한 방법을 알고 있다면 (즉 바닐라 커널의 모듈에서 사용할 수 있음) 매우 흥미가있을 것입니다.

+0

글쎄, 나는 IDT에서'page_fault' 핸들러를 대체함으로써 이룰 수 있다고 생각한다.그 외에도 코드 스플 라이스가 허용되지만 실제로는 더러운 해킹입니다. –

0

gnu libsegsev과 함께 사용자 레벨 호출기를 설치할 수 있습니다. 나는 그것을 사용하지 않았지만 당신이 찾고있는 것만 같다.

1

커널이 이러한 오류를 처리하는 방식을 변경하지 않고 이전에 커널을 추가하는 방식을 변경하지 않으려면 kprobes이 용도를 결정합니다. 레지스터와 스택을 포함하는 구조체에서 프로빙 된 함수의 인수를 얻고 정확히 컴파일러가 각각의 레지스터를 넣은 곳을 알아야하기 때문에 처리하기가 다소 어렵습니다. 그러나 특정 기능 (프로브 작성 중에 알려짐)이 필요한 경우, jprobes (here은 두 가지를 모두 사용하는 좋은 예입니다). 프로브 된 것과 동일한 인수로 프로브 할 수있는 기능이 필요합니다 레지스터/스택에서 mangling).

동적으로 커널 모듈을로드하고 커널을 수정하지 않고도 선택한 기능에 jprobes을 설치할 수 있습니다.

관련 문제