[pso] Tema 2 Linux - operatii buffer intern
Adrian - Razvan Deaconescu
pso@cursuri.cs.pub.ro
Wed, 30 Mar 2005 20:23:00 +0300
Salut,
m-am uitat prin lista de discutii de anul trecut si am intalnit o
intrebare care a produs-o oarecum pe a mea. Era vorba de scrierea unui
volum de date prea mare (in mesaj era o situatie cu 3 * BUF_LEN) in
buffer-ul intern al driver-ului. Solutia indicata (suficienta pentru
tema) a fost folosirea unui buffer de dimensiune mai mare - 4096.
Desi solutia a fost indicata, nu este clar cum se va realiza scrierea
in situatia specificata mai sus. Ceea ce intreb eu tine cont de
situatia in care dintr-un motiv sau altul (buffer-ul din user space
este prea mare sau cel intern este destul de plin) nu se pot scrie
toate datele din buffer-ul din user space.
Din cate imi dau seama ar fi 3 abordari posibile:
- o cerere de scriere incearca sa scrie cat poate (pana la umplerea
buffer-ului) si apoi asteapta (eventual intr-o coada), golirea unei
parti din buffer; in acest fel o cerere de scriere va scrie eventual
toate datele;
- o cerere incearca sa scrie cat poate si apoi se intoarce (abordare
total neblocanta)
- abordarea din exemplul de pe site: daca buffer-ul este plin se
asteapta intr-o coada de asteptare; se scrie in buffer-ul intern pana
la umplere si se iese (cu intoarcerea numarului de octeti scrisi)
Cam aceeasi situatie apare si la citire.
Intrebarea mea este, asadar, care abordare va fi folosita?
O intreabare oarecum pe aceeasi tema este urmatoarea: se permite
scrierea sau citirea concurenta a datelor in buffer-ul intern (cum
este in exemplul de pe site)? sau trebuie asigurata excluderea mutuala
astfel incat un singur apel de write asupra driver-ului sa poata
utiliza buffer-ul pana cand nu mai are date de scris (pentru a pastra
datele contiguu)?
Pentru apelul ioctl UART16550_IOCTL_SET_LINE e suficienta dezactivarea
intreruperilor pentru efectuarea schimbarilor asupra parametrilor de
comunicatie sau trebuie facut un FLUSH in prealabil astfel incat
datele existente sa fie transmise cu aceeasi parametri? Intrebarea
este cam stupida, probabil, dar nu stiu sigur ce impact are schimbarea
parametrilor asupra modului de transmitere a datelor si daca trebuiesc
luate anumite precautii pentru a nu le pierde.
Multumesc mult,
Razvan