[pso] intrebari tema 2 linux

Catalin Ionita io.catalin at gmail.com
Wed Apr 18 10:04:30 EEST 2007


Salut,

O sa incerc sa te ajut pe cat posibil,

 "- pentru testul de scriere com1 -> com2 banuiesc ca se poate folosi ceva
de genul echo "xxx" > /dev/com1
 - asta va apela pe rand functiile open, write si close din driverul meu "

Da e corect.

"cand cineva va face read pe com2, se apeleaza read care va returna ceva din
buffer-ul de read, sau se va bloca daca nu este nimic disponibil "

Conform enuntului temei readul si write-ul sunt blocante (adica daca nu
exista caractere suficiente pentru a
le servii raman blocate)

"dar unde intra intreruperile aici? trebuie sa fac din write-ul meu din
com1, direct outb pe i/o porturile lui com2 ceea ce va declansa o
intrerupere pe com2 si se vor pune astfel in handler date le in bufferul de
read?
in ce caz s-ar declansa o intrerupere de interes pentru bufferul de write?"

In primul rand trebuie sa intelegi ca tu scrii un driver care implementeaza
functionalitatea porturilor seriale.
Pe masina virtuala este facut un artificiu prin care se leaga cele 2 porturi
prin pipeuri. Deci ideea e ca daca scrii ceva pe com1 automat se va
transmite catre com2 si invers. Gandestete ca daca cele doua porturi nu ar
fi legate intre ele si ai fi facut o retea intre 2 calculatoare nu ai mai fi
putut sa faci ceva de genu "trebuie sa fac din write-ul meu din com1, direct
outb pe i/o porturile lui com2" pt ca mesajut tau trebuia sa ajunga prin
retea la celalalt calculator. Si la fel : nu stii cand primesti raspunsuri
inapoi.
Din cauza aceasta se folosesc intreruperi.Acum  nu o sa intru in detalii cum
ca sunt intreruperi soft (4 si 3 pt com1 com2) recunoscute de sistemul de
operare si intreruperi hardware specifice echipamentului (vreo 4 parca la
numar din care te intereseaza numai 3).
"in ce caz s-ar declansa o intrerupere de interes pentru bufferul de write?"
Daca tu folosesti bufferul de write pt a trimite din user-space in kernel si
dupa catre modem pt transmisie
in mod logic o intrerupere hardware care iti semnalizeaza ca buferul de
transmisie e gol e de interes si poti sa trimiti in continuare caractere din
bufer.

"In legatura cu presupunerea legata de CN si PM, pentru cei care se uita
putin cam stramb la pagina beyondlogic... mi-ai mai putea recomanda niste
resurse?"

sursele de aici referitoare la serial sunt mai mult decat complete. Exista
cod in C care te va ajuta la setarea
parametrilor modemului pe acolo , tot ce trebuie sa faci e sa citesti cu
atentie.

"PS: driverul trebuie sa fie SMP safe?"
De cand s-a introdus conceptul de muti-threading si preemptivitate a
kernelului nu se mai pune problema la nivel de multiprocesor. Este logic ca
daca ai mai multe treaduri kernel, acesul la datele partajate (cum ar fi o
lista in care se memoreaza ceva) sa fie safe. Oricum un kernel ups te va
anunta daca codul e safe sau nu la testare.

Numai bine,
Catalin Ionita

On 4/18/07, Alexandru Tudose <alexandru.tudose at gmail.com> wrote:
>
> Nu prea inteleg separarea intre functia de write/read si handlerele de
> intrerupere:
>
>  - pentru testul de scriere com1 -> com2 banuiesc ca se poate folosi ceva
> de genul echo "xxx" > /dev/com1
>  - asta va apela pe rand functiile open, write si close din driverul meu
>  - in write (din cate am inteles...) pun datele in bufferul de write, sau
> ma blochez daca nu am loc
>  - cand cineva va face read pe com2, se apeleaza read care va returna ceva
> din buffer-ul de read, sau se va bloca daca nu este nimic disponibil
>
> dar unde intra intreruperile aici? trebuie sa fac din write-ul meu din
> com1, direct outb pe i/o porturile lui com2 ceea ce va declansa o
> intrerupere pe com2 si se vor pune astfel in handler date le in bufferul de
> read?
> in ce caz s-ar declansa o intrerupere de interes pentru bufferul de write?
>
> In legatura cu presupunerea legata de CN si PM, pentru cei care se uita
> putin cam stramb la pagina beyondlogic... mi-ai mai putea recomanda niste
> resurse?
>
> PS: driverul trebuie sa fie SMP safe?
>
> scuze pentru miile de intrebari, dar daca nu intreb raman in ceata...
> Multumesc mult,
> Alex.
>
> On 4/9/07, Mihai Florian <my_mihai_florian at yahoo.com> wrote:
> >
> > Buna,
> >
> > Cred ca problema este ca nu ai inteles ca datele trebuie scrise/citite
> > pe portul serial (folosind outb si inb), nu doar retinute in memorie.
> >
> > Portul serial este folosit pentru comunicatia intre doua entitati
> > (calculatoare, dispozitive), doua capete ale aceleiasi conexiuni. Ce se
> > scrie la un capat va fi receptionat la celalt. In testul nostru am
> > facut o conexiune intre com1 si com2 folosind pentru ele acelasi pipe
> > in configuratia masinii virtuale. Asa ca ce va fi scris pe com1 poate
> > este receptionat pe com2 si invers. Cu alte cuvinte. Testul nostru
> > scrie pe com1 si citeste de pe com2, dupa care testeaza ca ceea ce s-a
> > receptionat este acelasi lucru cu ce s-a transmis. Nu trebuie sa
> > folosesti un buffer comun pentru cele 2 porturi, ci cum am spus mai
> > devreme trebuie sa scrii si sa citesti datele (de)pe porturi folosind
> > outb si inb. Ai nevoie de doua buffere care se folosesc in felul
> > urmator:
> > 1. bufferul pentru operatia read: scrii in acest buffer datele primite
> > pe portul serial (luate cu inb in handlerul de intrerupere) si le iei
> > din acest buffer si le scrii in bufferul din userspace (in functia
> > mread in cazul tau).
> > 2. bufferul pentru operatia write: scrii in el din bufferul din
> > userspace (in cazul tau din functia mwrite) si iei din el in handler-ul
> > de intrerupere si scrii pe port (cu outb).
> > Nu vad cum ai putea folosi acelasi buffer pentru ambele operatii avand
> > in vedere ca se refera la date diferite, unul la datele scrise pe port
> > si altul la datele citite de pe port, date care de obicei sunt
> > diferite. Nu prea te intereseaza sa citesti de pe portul serial ce
> > tocmai ai scris pe el, ci ce s-a scris la celalalt capat.
> >
> > Tema presupune ca esti familiarizat cat de cat cu portul serial (cel
> > putin de la CN si PM) si ca stii cam la ce se foloseste. Pentru restul
> > detaliilor tehnice am inclus in enuntul temei un link
> > http://www.beyondlogic.org/serial/serial.htm unde este explicat portul
> > serial in detaliu.
> >
> > Formularea din enunt: "pentru citirea/scrierea datelelor în/din porturi
> > nu trebuie să folosiţi funcţii amânabile (puteţi
> > să faceţi totul din întrerupere)" inseamna ca ai voie sa faci
> > outb si inb din handlerul de intrerupere si nu trebuie sa programezi o
> > actiune amanabila care sa faca citirile/scrierile.
> >
> > Ce inseamna functii blocante am explicat intr-un alt mail. Pe scurt:
> > read trebuie sa se blocheze daca nu exista date citite de pe
> > port(bufferul pentru read este gol) pana cand vin date, si write
> > trebuie sa se blocheze daca nu ai spatiu de scris in bufferul de write
> > pana cand se elibereaza o parte din el prin scriere pe port.
> >
> > Mihai
> >
> >
> >
> >
> > ____________________________________________________________________________________
> > Sucker-punch spam with award-winning protection.
> > Try the free Yahoo! Mail Beta.
> > http://advision.webevents.yahoo.com/mailbeta/features_spam.html
> > _______________________________________________
> > pso mailing list
> > pso at cursuri.cs.pub.ro
> > http://cursuri.cs.pub.ro/cgi-bin/mailman/listinfo/pso
> >
>
>
> _______________________________________________
> 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/20070418/7002a5b5/attachment-0001.html


More information about the pso mailing list