[so2] Tema2[Win]Transfer date

Mihai Ortelecan mihai.ortelecan at yahoo.com
Thu Jul 19 20:44:39 EEST 2012


Pe Linux , functiile de write/read transfera date intre user space si bufferele 
din kernel, iar in intrerupere se transferau date intre seriala si bufferele din 
kernel. Sincronizarea este destul de clara : 

Pentru read:
    - asteapta pana cand sunt date in bufferul din kernel ,apoi ia un spinlock 
si transfera datele din buffer in user space .

Pentru write:
    - asteapta daca bufferul din kernel este plin de date, apoi ia un spinlock 
si transfera datele ...

In intrerupere:
   - verifica daca e vorba de read/write, ia un spinlock si atata timp cat 
dispozitivul zice ca poti transfera date, transfera date .Apoi notifica 
read/write ca pot incepe transferul de date. 

In windows nu reusesc sa mi dau seama unde anume trebuie facut acest transfer 
de date?Mai precis unde se face efectiv RtlCopyMemory dintr-un buffer in altul.
(1)

Daca am inteles corest , problema ar trebui sa poate fi rezolvata similar cu 
varianta pe linux, folosind evenimente.In windows, in loc de acel spinlock 
trebuie folosit KeSynchronizeExecution, asta inseamna ca in datele deviceului, 
ca sa pot efectiv face transferul de date, trebuie sa mai retin inca un buffer 
care sa ia valoarea lui irp->AssociatedIrp.SystemBuffer si eventual o variabila 
in care sa scriu numarul de octeti scrisi/cititi pentru a putea face apoi 
IoCompleteRequest ?(2) 

In exemplul case, din ce am inteles, se salveaza irp urile de write intr-o lista 
si se seteaza ca fiind pending. In read, se itereaza lista de irp-uri de write, 
si se face transferul de date direct din bufferul asociat iru-ului de write in 
bufferul irp-ului de read. Cu aceasta abordare, nu inteleg de ce am mai avea 
nevoie de un buffer suplimentar in implementarea temei. In rutina de intrerupere 
nu putem sa iteram irp-urile de write si sa scriem direct din bufferele asociate 
pe seriala?(3)
Si de ce nu am putea face acelasi lucru si pentru read(salvam irp-urile intr-o 
lista, le marcam ca pending , iar in intrerupere scriem in ele)?(4)
 



More information about the so2 mailing list