This shows you the differences between two versions of the page.
so2:laboratoare:lab12:exercitii [2018/05/16 10:05] ionel.ghita |
so2:laboratoare:lab12:exercitii [2019/05/20 14:32] (current) razvan.deaconescu [1. [2p] Implementare bus] |
||
---|---|---|---|
Line 103: | Line 103: | ||
===== Completare formular de feedback ===== | ===== Completare formular de feedback ===== | ||
- | Apreciem opinia voastră legată de activitățile cursului de SO2. Ne ajută să îmbunătățim cursul și să facem materia cât mai accesibilă și interesantă. Pentru această vă rugăm să completați [[http://cs.curs.pub.ro/2017/blocks/feedbackacs/stats.php?courseid=144&blockid=2391|formularul de feedback de pe cs.curs.pub.ro]] (trebuie să fiți autentificați și înrolați în cadrul cursului). Vă mulțumim! | + | Apreciem opinia voastră legată de activitățile cursului de SO2. Ne ajută să îmbunătățim cursul și să facem materia cât mai accesibilă și interesantă. Pentru această vă rugăm să completați [[https://acs.curs.pub.ro/2018/course/view.php?id=295|formularul de feedback de pe cs.curs.pub.ro]] (trebuie să fiți autentificați și înrolați în cadrul cursului). Vă mulțumim! |
==== 1. [2p] Implementare bus ==== | ==== 1. [2p] Implementare bus ==== | ||
+ | |||
Analizați conținutul fișierului ''bex.c'', care conține implementarea unui driver de magistrală. Urmăriți comentariile marcate cu ''TODO 1'' pentru a implementa părțile ce lipsesc: înregistrați driverul de magistrală și adăugați un nou device, numit ''root'', cu tipul ''none'' și versiunea ''1''. | Analizați conținutul fișierului ''bex.c'', care conține implementarea unui driver de magistrală. Urmăriți comentariile marcate cu ''TODO 1'' pentru a implementa părțile ce lipsesc: înregistrați driverul de magistrală și adăugați un nou device, numit ''root'', cu tipul ''none'' și versiunea ''1''. | ||
<note tip> | <note tip> | ||
Aruncați o privire pe implementarea funcției ''bex_add_dev()''. | Aruncați o privire pe implementarea funcției ''bex_add_dev()''. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Înregistrarea și deînregistrarea o faceți folosind respectiv funcțiile ''bus_register()'' și ''bus_unregister()''. | ||
</note> | </note> | ||
Line 119: | Line 124: | ||
Adăugați două atribute read-only: ''type'' și ''version''. Urmăriți comentariile marcate cu ''TODO 2''. | Adăugați două atribute read-only: ''type'' și ''version''. Urmăriți comentariile marcate cu ''TODO 2''. | ||
+ | |||
+ | <note tip> | ||
+ | Va trebui să adăugați cele două atribute ''type'' și ''version'' în structura ''bex_dev_attrs'' pe modelul: | ||
+ | <code> | ||
+ | &dev_attr_<insert-attribute-type-here>.attr, | ||
+ | </code> | ||
+ | </note> | ||
Observați că cele două atribute noi sunt vizibile în ''/sys/bus/bex/devices/root''. Verificați conținutul acestor atribute. | Observați că cele două atribute noi sunt vizibile în ''/sys/bus/bex/devices/root''. Verificați conținutul acestor atribute. | ||
+ | O implementare pentru funcția de afișare de type este | ||
+ | |||
+ | <code c> | ||
+ | static ssize_t | ||
+ | type_show(struct device *dev, struct device_attribute *attr, char *buf) | ||
+ | { | ||
+ | struct bex_device *bex_dev = to_bex_device(dev); | ||
+ | |||
+ | return sprintf(buf, "%s\n", bex_dev->type); | ||
+ | } | ||
+ | DEVICE_ATTR_RO(type); | ||
+ | </code> | ||
==== 3. [2p] Adăugare atribute del și add ==== | ==== 3. [2p] Adăugare atribute del și add ==== | ||
- | Adăugați două atribute write-only, numite ''del'' și ''add''. | + | Adăugați două atribute write-only, numite ''del'' și ''add''. ''del'' așteaptă un nume de device pentru a îl elimina, iar ''add'' așteaptă numele, tipul și versiunea pentru a crea un device nou. Urmăriți comentariile marcate cu ''TODO 3''. |
- | ''del'' așteaptă un nume de device pentru a îl elimina, iar ''add'' așteaptă numele, tipul și versiunea pentru a crea un device noi. Urmăriți comentariile marcate cu ''TODO 3''. | + | |
+ | <note tip> | ||
+ | Va trebui să adăugați atributele ''del'' și ''add'' în structura ''bex_bus_attr'' pe modelul: | ||
+ | <code> | ||
+ | &bus_attr_<insert-attribute-name-here>.attr, | ||
+ | </code> | ||
+ | |||
+ | </note> | ||
<note tip> | <note tip> | ||
Line 131: | Line 162: | ||
</note> | </note> | ||
- | Creați un device nou și verificați dacă este vizibil în ''/sys/bus/devices''. Eliminați-l și verificați că a dispărut din ''sysfs''. | + | Un exemplu de funcție de tipul ''store'' este: |
+ | |||
+ | <code c> | ||
+ | static ssize_t | ||
+ | add_store(struct bus_type *bt, const char *buf, size_t count) | ||
+ | { | ||
+ | char type[32], name[32]; | ||
+ | int version; | ||
+ | int ret; | ||
+ | |||
+ | ret = sscanf(buf, "%31s %31s %d", name, type, &version); | ||
+ | if (ret != 3) | ||
+ | return -EINVAL; | ||
+ | |||
+ | return bex_add_dev(name, type, version) ? : count; | ||
+ | } | ||
+ | BUS_ATTR(add, S_IWUSR, NULL, add_store); | ||
+ | </code> | ||
+ | |||
+ | Creați un device nou și verificați dacă este vizibil în ''/sys/bus/bex/devices''. Eliminați-l și verificați că a dispărut din ''sysfs''. | ||
<note tip> | <note tip> | ||
Line 157: | Line 207: | ||
Încercați din nou adăugarea unui dispozitiv de tip ''bex'' și observați că de data aceasta funcția de ''probe'' este apelată. | Încercați din nou adăugarea unui dispozitiv de tip ''bex'' și observați că de data aceasta funcția de ''probe'' este apelată. | ||
- | ==== 5. [2p] Înregistrarea unui device bex misc în funcția probe ==== | + | ==== 5. [1.5p] Înregistrarea unui device bex misc în funcția probe ==== |
- | Modificați ''bex.c'' astfel încât operația ''probe'' să eșueze dacă ''version > 1''. Înregistrați device-ul misc în funcția ''bex_misc_probe'' și deînregistrați-l în ''bex_misc_remove''. Urmăriți comentariile marcate cu ''TODO 6''. | + | Modificați ''bex_misc.c'' astfel încât operația ''probe'' să eșueze dacă ''version > 1''. Înregistrați device-ul misc în funcția ''bex_misc_probe()'' și deînregistrați-l în ''bex_misc_remove''. Urmăriți comentariile marcate cu ''TODO 6''. |
<note tip> | <note tip> | ||
Line 174: | Line 224: | ||
</note> | </note> | ||
- | ==== 6. [0.5p] Monitorizarea notificărilor uevent ==== | + | ==== 6. [1p] Monitorizarea notificărilor uevent ==== |
Folosiți comanda ''udevadm'' și observați ce se întâmplă când: | Folosiți comanda ''udevadm'' și observați ce se întâmplă când: | ||
* modulele ''bex.ko'' and ''bex_misc.ko'' sunt inserate | * modulele ''bex.ko'' and ''bex_misc.ko'' sunt inserate |