2013-04-25 5 views
1

Linux 커널에서 페이지 폴트 예외 처리를 가로 채기해야하지만 커널 소스를 수정하고 커널을 컴파일 할 수 없습니다. 커널 모듈에서이 작업을 수행해야합니다. 나는 여러 가지 접근법을 가지고있다. 리눅스 커널의 예외 처리기를 차단하는 가장 좋은 방법은 무엇입니까


  1. 는 IDT 테이블을 복사하여 페이지 오류의 ISR을 교체합니다. 그러나 커널의 어셈블리 코드를 살펴본 결과 ISR이 모듈의 컴파일시 주소를 확인할 수없는 함수를 호출한다는 것을 알았습니다. 예 : callq *0x2b0a07(%rip) # ffffffff81620100 <pv_irq_ops+0x30>.
  2. do_page_fault을 가로 채기 위해 kprobe/jprobe 메커니즘을 사용하십시오. 그러나 모든 커널이 kprobe를 사용하도록 구성된 것은 아닙니다.
  3. do_page_fault의 처음 몇 바이트를 내 코드로 건너 뛰는 점프 명령어로 바꿉니다. 그러나, 내 코드에서 do_page_fault 후자를 사용해야합니다. 교체 된 명령어를 다른 곳에 넣어야하지만 x86 코드의 크기는 결정하기 어렵고 교체 된 명령어 중 하나가 점프되면 상황이 더욱 복잡해집니다.

혹시이 문제를 해결할 생각이 있습니까?

답변

4

처리기를 가리 키도록 IDT 항목을 변경하십시오. 필요한 경우 /에서 원래 핸들러를 호출하십시오. IDT를 복사하거나 기존 코드를 패치 할 필요가 없습니다.

+0

귀하의 답변에 영감을 받았습니다. 이 접근 방식에는 약간의 문제가 있습니다. 트랩 프레임과 오류 코드를 두 번 푸시하고 팝업해야합니다. 그러면 성능이 약간 저하 될 것입니다. 다른 우아한 접근법이 없다면,이 것이 나의 선택이어야합니다. – RichardUSTC

+0

예외적 인 상황을 제외하고는 예외를 사용하고 싶지 않습니다. 트랩 코드를 한 번만 통과해야하는 경우에도 저렴하지 않습니다. –

+0

@AlexeyFrunze 이것을 수행 할 기회가 있습니까? – dimba

관련 문제