2013-12-13 5 views
4

로드 가능한 커널 모듈로 kprobe를 변환하려고했습니다.kprobes에서 정의되지 않은 예외 처리기 (__und_svc)의 역할은 무엇입니까?

samples/kprobes/ 폴더에서 사용할 수있는 샘플을 커널 트리에서 실행할 수 있습니다.

커널에 kprobes를 구성하면 (CONFIG_KPROBES) svc_entry 매크로가 __und_svc() 처리기에서 64 바이트로 확장됩니다.

참조 : http://lxr.free-electrons.com/source/arch/arm/kernel/entry-armv.S?a=arm#L245

내 목표는 커널 모듈로 kprobe을, 커널면을 만지지 않고있다.

그래서 CONFIG_KPROBES를 사용하지 않고 커널을 컴파일합니다. 그래서 svc_entry 매크로는 0으로 확장됩니다. __und_svc()

나는 이러한 의문에서 벗어나고 싶습니다.

  1. kprobe가 정의되지 않은 명령어 예외 처리되는 경우 __und_svc() 호출 왜 (bcos 만 생성 을 kprobe). kprobes와 관련하여 __und_svc() 처리기의 역할은 무엇입니까 ??

  2. 64 바이트 메모리가 의무적 인 경우 커널을 컴파일하는 방법을 없이 할당하는 방법. 동적으로 수행하는 방법

지식을 공유하십시오.

+0

나는 정확한 질문을 좋아하지만,이 질문은 너무 구체적입니다. 커널 관련 메일 링리스트 중 하나를 사용해 보셨습니까? –

+0

예. 나는이 질문을 systemtap 메일 링리스트와 linux-arm 메일 링리스트에 올렸다. 불운은 리눅스 팔에 아직 출판되지 않았다. – Jeyaram

답변

5

사물에 대한 이해가별로 좋지 않으므로 답변을 구하지 못할 수도 있습니다. 목록에있는 사람이 응답하는 데는 다소 시간이 걸릴 수 있습니다. kprobes.txt을 읽고 ARM 아키텍처에 대해 자세히 검토하십시오.

kprobe가 정의되지 않은 명령어 예외 (bcos kprobe 만 생성됨)로 처리되는 경우 이유는 __und_svc()입니다. kprobes와 관련하여 __und_svc() 처리기의 역할은 무엇입니까? 는 ARM에

는 모드 0b11011 는 무정의 명령 모드이다. 무정의 명령 발생 흐름이다 미확정 명령

  1. lr_und = PC + 명령어 발생 모드 4
  2. SPSR_und = CPSR.
  3. 인터럽트가 비활성화 된 모드를 ARM으로 변경합니다.
  4. PC = 벡터베이스 + 4

단계 __vectors_start에 위치한 네 개의 주요 벡터 테이블 vector_und이 단지 분기. 이 코드는 vector_stub이라는 매크로로 __und_svc 또는 __und_usr을 호출합니다.스택은 프로세스 당 예약 된 4/8k 페이지입니다. 작업 구조와 커널 스택을 모두 포함하는 커널 페이지입니다.

k 프로브은 확인하려는 코드 주소에 정의되지 않은 지침 을 삽입하여 작동합니다. 즉, 정의되지 않은 명령어 처리기이 필요합니다. 이것은 꽤 분명해야합니다. 두 개의 루틴, call_fpe 또는 do_undefinstr()을 호출합니다. 2 번째 케이스에 관심이 있습니다.이 케이스는 opcode를 받고 call_undef_hook()으로 전화합니다. register_undef_hook()으로 후크 추가하기. 너는 arch_init_kprobes()을 볼 수있다. 메인 콜백 kprobe_handlerstruct pt_regs *regs과 함께 호출되며, 이는 __und_svc에 예약 된 여분의 메모리 일 수 있습니다. 예를 들어, kretprobe_trampoline()은 현재 실행중인 스택과 함께 트릭을 실행합니다.

64 바이트 메모리가 의무적 인 경우 커널을 컴파일하지 않고 할당하는 방법. 동적으로 수행하는 방법입니다.

아니요. 다른 메커니즘을 사용할 수 있지만 kprobes 코드를 수정해야 할 수 있습니다. 대부분의 경우 기능을 제한해야합니다. 또한 스택 프레임을 완전히 다시 쓰고 사실 이후 여분의 64 바이트를 예약 할 수도 있습니다. kmalloc()과 같지 않습니다. 수퍼바이저 스택 포인터에서 숫자를 더하거나 뺍니다. 나는이 코드가 krebed 주소의 컨텍스트 (ISR, 하단 절반/스레드 IRQ, work_queue, 커널 작업)에서 실행하기 위해 정의되지 않은 핸들러의 반송 주소를 다시 쓰는 것으로 추측합니다. 그러나 아직 발생하지 않은 추가 문제가있을 수 있습니다. arch_init_kprobes()이 호출되지 않으면 항상 __und_svc에 예약 할 수 있습니다. 64 바이트의 스택을 먹어 버리면 커널 스택이 오버플로 될 가능성이 커집니다. 즉, 변경,

__und_svc: 
    @ Always reserve 64 bytes, even if kprobe is not active. 
    svc_entry 64 

arch_init_kprobes() 실제로이 기능을 설치하는 것입니다.

+0

'call_undef_hook()'관련 정보를 알려 주셔서 감사합니다. 더 유익한. 하지만 __und_svc()를 entry-armv.S에서 변경할 수는 없습니다. 커밋'd30a0c8bf99f0e6a7d8c57bd4524039585ffbced'에서이 64 바이트 만 추가됩니다. 그래서 나는 그들이 추가 한 기능/버그를 이해하려고 노력하고있다. – Jeyaram

+0

커널을 패치하십시오. 작업을 조정하는 코드로 * entry-armv.S *,'svc_entry'를 설정 한 다음 항상'svc_entry 64'를 사용하십시오. 전체 패치 세트를 가져올 필요가 없습니다. 'git diff d30a0c8bf99 ~ 1..d30a0c8bf99'는 완전한 패치를 제공합니다. 그것을 저장하고'echo svc_entry.patch | 패치 -p1'. 아니면 커널을 다시 컴파일 할 수 없는지 묻고 있습니까? 이것은 불가능한 것입니다. * arm/kernel/kprobes.c * 코드를 모두 다시 써야합니다. –

+0

필자의 요구 사항은 패치를 적용하거나 커널에 단일 변경을 적용하지 않고 kprobes를 LKM으로 수정합니다. 그래서 나는 arm/kernel/kprobes.c를 다시 쓰는 것을 제외하고는 옵션을 가지고 있지 않다. – Jeyaram