[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