2011-11-01 2 views
0

리눅스 용 커널 모듈을 만들고 있습니다. 각 프로세스가 커널 루틴 내에서 소비 한 시간을 확인해야합니다. 나는 커널이 task_struct 내의 stime 안에이 정보를 유지한다는 것을 안다. 문제는 각 프로세스에 대해이 정보를 모듈에 어떻게 가져올 지 확신 할 수 없다는 것입니다. 모듈에서 task_struct를 생성합니까? 모든 프로세스에서 정보를 얻으려면 어떻게해야합니까?커널 루틴에서 소비 한 CPU 시간 프로세스의 양을 확인하십시오.

답변

2

runnings 작업에서 데이터를 수집하는 방법 linux/kernel/taskstats.c 파일을 확인하십시오. 어쩌면 코드의 일부를 재사용 할 수 있습니다.

2

커널이 모든 필요한 기호를 내보낼 수 없기 때문에 Linux 커널 모듈에서 모든 프로세스를 반복하는 것은 약간 까다 롭습니다. 커널을 약간 수정하거나이 작업을위한 더 깊은 API에 의존해야 할 수도 있습니다. 이는 일반적으로 커널 모듈에 의해 수행되는 작업이 아닙니다.

기존 커널 코드의 예를 살펴 보겠습니다. Linux 2.6.39, 커널/cpu.c :

static inline void check_for_tasks(int cpu) 
{ 
    struct task_struct *p; 

    write_lock_irq(&tasklist_lock); 
    for_each_process(p) { 
      if (task_cpu(p) == cpu && p->state == TASK_RUNNING && 
       (!cputime_eq(p->utime, cputime_zero) || 
       !cputime_eq(p->stime, cputime_zero))) 
        printk(KERN_WARNING "Task %s (pid = %d) is on cpu %d " 
          "(state = %ld, flags = %x)\n", 
          p->comm, task_pid_nr(p), cpu, 
          p->state, p->flags); 
    } 
    write_unlock_irq(&tasklist_lock); 
} 

이 기능은 작업 목록을 반복합니다. 물론, 목록을 수정하지 않으면 쓰기 잠금 대신 읽기 잠금을 사용할 수 있습니다.

tasklist_lock은 내보낼 수 없으므로 (즉, 소스에 아무 곳에도 EXPORT_SYMBOL(tasklist_lock)이 없으므로 커널을 추가하고 커널을 다시 컴파일하면 커널 모듈을 동적으로 연결할 수 있습니다).

관련 문제