2017-05-12 8 views
0

실행중인 프로세스의 스케줄 된 명령어를 검사하는 커널 모듈을 작성하고 싶습니다. 이미 프로세스를 반복하는 방법을 설명하는 Linux Kernel Process Management을 보았습니다.커널 모듈에서 예약 된 프로세스 명령어에 액세스하십시오.

struct task_struct *task; 
for_each_process(task) { 
    /* this pointlessly prints the name and PID of each task */ 
    printk("%s[%d]\n", task->comm, task->pid); 
} 

하지만이 task_struct 잡아 일단, 어떻게 지침을받을 수 있나요? 나는 어느 명령어가 다음에 실행될 것인지를보기 위해 프로그램 카운터를 먼저 찾아야한다고 가정하고있다.

task_struct의 회원은 지침에 따라 조사해야합니까? 어떤 종류의 struct 유형이 저장되어 있습니까?

도움 주셔서 감사합니다. 나는 커널 프로그래밍에 익숙하지 않다.

+0

사용자 스택 포인터는 실행할 다음 명령어가있는 스택 위치를 가리켜 야합니다 (또는 스택 동작 방식에 따라 적어도 스택 옆에 있어야 함). – ThingyWotsit

+0

@ThingyWotsit, 좋습니다. 스택을 따라 "걷는"방법이 있습니까? 지침은 내가 따를 수있는 연결 목록과 같은 것입니까? –

답변

2

다음은 귀하의 last question입니다. task_struct을 통해 프로세스 프로그램 카운터 (x86의 명령어 포인터라고도 함)에 액세스 할 수 있습니다. 해당 명령 집합에 특정한 지침을 찾는 데 관심이 있다고 명시한대로 x86에 대해 대답 할 것입니다.

arch/x86/include/asm/processor.h 파일을 확인해야합니다. 휠을 재발견 할 필요가 없도록 몇 가지 헬퍼 매크로와 함수가 포함되어 있습니다. 관심을 가질 가능성이 가장 큰 항목 중 하나는 task_pt_regs(task)입니다. 이 매크로는 주어진 작업과 관련된 모든 레지스터 값을 제공합니다. 이 값은 struct pt_regs에 포함되어 있습니다. 이 구조체의 정의는 arch/x86/include/asm/ptrace.h에 있습니다. 관심있는 회원은 unsigned long ip입니다.

이제 프로세스에서 실행할 다음 명령을 가리키는 메모리 주소가 있습니다. 그래도 사용하려면 실제 주소로 변환해야합니다. 그것은 다른 질문을위한 주제입니다.

귀하의 의견에 질문에 대한 답변을 한 번 적어 두십시오. 지침은 연결된 목록과 같은 일부 데이터 구조에 저장되지 않습니다. 그들은 단순히 모든 피연산자를 순서대로 나열합니다. 프로세서에 의해 파싱 될 수있는 바이너리 파일처럼 생각해야합니다.