[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