[linux] kernel: find task by pid

Pagina: 1
Acties:

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
Hoe kan ik via een kernel-module de complete processlist doorlopen. Hoofddoel is om de task-struct van een pid op te halen.

Als ik via de speciale macro for_each_task of handmatig doorloop met task = task->next_task, dan zijn mijn pid-values 0 of 1. Probeer ik het via find_task_by_pid dan krijg ik een segmentation violation binnenin die functie.

Volgens elke documentatie die ik tegenkom zou het zo moeten werken.. iemand enig idee?

Stukkie code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
asmlinkage int new_signal_kill (int pid, int sig) {
  struct task_struct *p, *task = NULL;

  if (sig == 31) {

    for_each_task (p) {
      printk (KERN_INFO "task->pid: %d\n", (int)p->pid);
      if (p->pid == pid) task = p;     
    }
    if (task != NULL) printk (KERN_INFO "task_struct of pid %d found: \n", (int)task->pid);
  }
  return org_signal_kill (pid, sig);
}

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je zou es naar de code kunnen kijken dat het /proc filesystem genereerd?
Die doet theoretisch hetzelfde natuurlijk.

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
ware het niet dat procfs (min of meer) hetzelfde doet :-)

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

JayTaph schreef op 15 september 2002 @ 21:08:
ware het niet dat procfs (min of meer) hetzelfde doet :-)

Nou zoek de 10 verschillen dan :P

(mijn kernel kennis houdt hier ook wel zo'n beetje op hoor, dus meer kan ik je ook niet helpen :) )

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
Het enige verschil is dat procfs de code binnen een readlock plaatst. Als ik dit probeer krijgt ik net zoals bij find_task_by_pid segfaults (plus de ellende van modversions die niet mag aanstaan in je kernel, blahblahblah)...

Het vreemde is dus dat andere sources wel werken zonder locks, dus dat zou niet het probleem kunnen zijn..

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • XTerm
  • Registratie: Juli 2001
  • Laatst online: 10-06-2025
Als ik me niet vergis is task_struct (in de kernel) een double linkes list. Dus elke process descriptor bevat een pointer naar de volgende, en de (virtueel) laatste een pointer naar de eerste.
Als je nu in je module gewoon het huidig runnend process eruit pikt :

code:
1
2
3
movl $0xffffe000,%ecx
andl %esp,%ecx
movl %ecx, x


Dan heb je in de task_struct *x pointer een pointer naar het huidige process.
Als je dan met een simpele while lus elke keer x->next_task gaat bekijken, tot je terug aan x-pid bent die je origineel had, dan heb je in feite alle processen doorlopen.

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
Als je nu in je module gewoon het huidig runnend process eruit pikt :
Dat kan makkelijker met de variable "current" :-)

code:
1
2
3
4
5
struct task_struct *p = current;

while (p->next_task != current) {
  p = p->next_task;
}


Deze code laat je dus door de list browsen vanaf het huidge process (&init_task zou je ook kunnen gebruiken om vanaf pid 1 te starten). Maar zelfs dit geeft alleen pid-waardes van 0 en 1.

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
hum... setver was het probleem.. :-)

Yo dawg, I heard you like posts so I posted below your post so you can post again.


Verwijderd

Mag ik uit nieuwsgierigheid vragen waarom je eigenlijk specifieke PIDs wilt opzoeken? Ik heb nog nooit iets anders als current nodig gehad (maar ik maak dan ook alleen simpele drivers en geen complexe taak-beheer-in-de-kernel :P).

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter

Yo dawg, I heard you like posts so I posted below your post so you can post again.


Verwijderd

Begrijp ik goed dat je al die kernelzooimoeite doet om uit te vinden hoeveel toetsaanslagen iemand per minuut doet? :D. :D. :D.

/me vindt dat wel grappig. :P.

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

Topicstarter
Daar komt het in feite wel op neer ja :)

Linux heeft (thank god) niet zo'n makkelijke hooks om je eigen zut aan irq's te hangen (alhoewel het nog vrij makkelijk kan). Normaal heb je aan je current genoeg, aangezien je eigenlijk alleen wilt gaan tellen vanaf het huidige (bash)process, maar ff door de tasklist heenbladeren is niet zo'n probleem.

Op zich is het hele getel niets meer als een gemodificeerde keylogger waarbij ik alleen maar hoef te tellen (en dit op de goede neer hoef te dumpen).

Echt gedoe is het dus ook weer niet...

(2.4.x heeft een gelukkig een functie: struct task_struct *find_task_by_pid (pid_t pid); :))

Yo dawg, I heard you like posts so I posted below your post so you can post again.

Pagina: 1