2011-10-21 2 views
2

커널 (이 경우 Linux)에서 프로세스 컨텍스트 (시스템 호출, 페이지 오류 등)에서 PTRACE_SINGLESTEP로 ptrace_request를 호출하면 어떤 일이 발생하는지 궁금합니다. 사용자 공간 명령 또는 커널 공간 명령을 단일 단계로 실행합니까? 필자는 ptrace가 사용자의 지시 사항을 한 단계 씩 수행 할 수 있다는 것을 알고 있습니다. 이것이 왜 내가 생성 할 행동에 대해 궁금합니다.프로세스 컨텍스트에서 커널의 단일 단계를 수행 하시겠습니까?

조금 더 많은 정보를 제공하기 위해 페이지 폴트 처리기 (단일 단계에서 오류가 있지만 PTE를 변경하여 명령이 진행되도록)에서 시도하고 있습니다. 나는 이것이 심지어 가능할 지 아니면 프로세스를 다시 실행하는 것과 같이 다른 방법을 필요로하는지 궁금합니다.

이것은 프로세스의 task_struct (선점 된 경우)가 실행되기 때문에 발생합니다. 여전히 커널 공간 처리기 IIRC를 가리킬 것이므로 ptrace를 사용한 단일 스테핑은이를 우회하여 올바른 사용자 공간 명령을 수행하거나 전혀하지 않겠습니까?

답변

1

내가 무엇을 의미하는지 완전히 이해하지 못한다. PTRACE_SINGLESTEP는 항상 사용자 컨텍스트에서 커널에서 호출된다. syscall ptrace (PTRACE_SINGLESTEP)를 수행하면 커널 함수에서 해당 함수를 실행하게된다. 일반적으로 동작하고 ptracing하는 프로세스를 페이지 폴트 핸들러에서 호출해도 상관없이 하나의 명령어 만 실행하십시오. 평소와 같이 커널 토지에있을 때는 단일 단계로 진행할 수 없습니다.

단일 단계가 실제로 어떻게 작동하는지 이해하려면 arch/x86/kernel/ptrace.c를 살펴 보는 것이 좋습니다. 단일 계단식 명령은 실제로 커널에 의해 에뮬레이션되고, IIRC에는 하드웨어 지원이 없습니다.

0

질문에 대한 대답을 이해하려면 인텔 하드웨어를 이해해야합니다.

먼저 우리는 간단한 명령으로 시작 (SINGLE_STEP 단일 스텝 모드로 인텔 CPU를 넣어이며, 때문에 하나 struction 실행 한 후 다시 인터럽트 핸들러에 반환) :

의 movl (EAX), EBX

인텔 포맷에 따라, 이것은 eax 내부의 값을 취하여 메모리 포인터로 취급하고, 메모리에 액세스하고, 4 바이트 값을 가져 와서 ebx로 복사하는 것을 의미합니다.

이 하나의 어셈블리 명령어는 커널 대 사용자 컨텍스트에서 실행될 때 다른 동작/의미를 갖습니다.

커널에있는 경우 커널의 페이지 표를 사용하여 메모리에 액세스하고 데이터를 ebx에 복사합니다. 사용자 프로세스에서 사용자의 페이지 표는 메모리에서 데이터를 읽고 ebx로 복사하기 위해 (MMU 하드웨어에 의해) 사용됩니다. eax의 값은 동일하지만 CR3 레지스터의 값이 다르면 (다른 프로세스 컨텍스트를 의미 함) 메모리의 다른 부분을 읽을 수 있습니다. 그래서 커널에서 사용자 공간 프로그램을 추적하는 것은 정말 우습다. 왜냐하면 사용자 명령을 실행하기 전후에 컨텍스트 스위치 (레지스터 저장 및 복원 작업의 전체 세트가 필요함)를 수행해야하기 때문에 4 가지 작업을 효과적으로 수행 할 수 있습니다.

위에서 알 수 있듯이 내가 언급 한 커널 기능 API는 언급하지 않았습니다. 전반적인 개념 이해가 우선입니다.

관련 문제