[pso] [tema2][win] DPC-uri, IRP-uri, evenimente
Bercea Gabriel
gamitech at gmail.com
Wed Apr 22 01:28:45 EEST 2009
Daca a trecut un test asta nu inseamna ca va merge in orice conditie care
poate aparea in ISR.
Poti sa aloci memorie Paged si sa o folosesti intr-un DPC sau spinlock si
cateodata sa iei BSOD cateodata nu, asta nu inseamna ca driverul tau e scris
bine.
ISR ul este mereu apelat la DIRQL, cu intrereruperile masked off, deci
intreruperea poate fi intrerupta si ea la randul ei de o intrerupere cu un
IRQL mai mare, ceea ce pentru schedduler/dispatcher si threaduri pending
conteaza foarte mult.
Ceea ce s-a intamplat la tine a fost ca exact in momentul in care ai apelat
KeSetEvent (KEVENT fiind alocat din nonpaged ) nu a fost nevoie de alta
componenta a sistemului de operare pentru a marca evenimentul signaled.
Probabil ai folosit un NotificationEvent.
ISR urile si DPC urile nu au un thread-stack like structure ci un
per/CPU-stack al lor pe care il folosesc. Nu prea se poate vorbi de thread
context intr-un DPC, cu atat mai putin intr-un ISR, so, un event fiind
strong legat de un context, atentie la alte teste J
PS:
Pentru performante mai bune din Vista incolo exista ThreadedDPCs. Se executa
si la PASSIVE_LEVEL. Pot fi preemtate deci, threadurile realtime pot sa isi
faca treaba mai bine -> mai putine freezuri :P
Read more.
Cu respect,
Bercea Gabriel 342 C2
Mobile contact: (+40)0740049634
eMail: gamitech at gmail.com
Blog: http://gamitech.blogspot.com/
Linkedin: http://www.linkedin.com/in/gamitech
From: pso-bounces at cursuri.cs.pub.ro [mailto:pso-bounces at cursuri.cs.pub.ro]
On Behalf Of Corneliu Paul Lupulet
Sent: Tuesday, April 21, 2009 10:46 PM
To: Proiectarea Sistemelor de Operare
Subject: Re: [pso] [tema2][win] DPC-uri, IRP-uri, evenimente
Salutare!
Ai nevoie de un DPC pentru ca nu poti rula KeSetEvent direct din
intrerupere[1] ("the caller can be running at IRQL <= DISPATCH_LEVEL).
Planifici practic DPC-ul doar pentru a rula KeSetEvent si sa trezesti
procesul ce asteapta in rutina de rea/write.
Am citit si eu acelasi lucru pe msdn si anume: "If Wait is set to FALSE,
the caller can be running at IRQL <= DISPATCH_LEVEL" dar tin sa te
contrazic.
Dar eu apelez KeSetEvent() din rutina de tratare a intreruperii si merge
(nu-mi da BSOD si trece toate testele). Am uploadat tema pe site.
Dar nu inteleg care este fenomenul? Ma gandesc ca desi intreruperea se
genereaza la un IRQL > DISPATCH_LEVEL, rutina mea de tratare este apelata de
kernel la IRQL = DISPATCH_LEVEL.
Am zis sa intreb pentru a stii daca se va depuncta faptul ca nu am folosit
DPC si sa aflu si care este explicatia fenomenului.
Cornel
Razvan
[1] http://www.osronline.com/DDKx/kmarch/k105_1prm.htm
_______________________________________________
pso mailing list
pso at cursuri.cs.pub.ro
http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/pso/attachments/20090422/b69c11d6/attachment.htm>
More information about the pso
mailing list