This shows you the differences between two versions of the page.
so2:teme:tema0 [2017/03/09 11:46] alexandru.jercaianu [Întrebări] |
so2:teme:tema0 [2020/03/01 20:03] (current) constantin.ghioc [Sfaturi] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Tema 0 - Kernel API ====== | ====== Tema 0 - Kernel API ====== | ||
- | * Termen de predare: **Duminică, 12 Martie 2017, ora 23:00** | + | * Termen de predare: **Duminică, 15 Martie 2020, ora 23:00** |
Line 16: | Line 16: | ||
Este obligatorie folosirea [[https://github.com/torvalds/linux/blob/master/include/linux/list.h|API-ului de liste]] implementat în kernel. Pentru detalii puteți urmări [[http://ocw.cs.pub.ro/courses/so2/laboratoare/lab03#liste|laboratorul 3]]. | Este obligatorie folosirea [[https://github.com/torvalds/linux/blob/master/include/linux/list.h|API-ului de liste]] implementat în kernel. Pentru detalii puteți urmări [[http://ocw.cs.pub.ro/courses/so2/laboratoare/lab03#liste|laboratorul 3]]. | ||
- | Pentru realizarea temei, trebuie să porniți de la [[http://elf.cs.pub.ro/so2/res/teme/list-skeleton.c|scheletul de cod]] oferit. | + | Pentru realizarea temei, trebuie să porniți de la schelet-ul de cod [[https://github.com/linux-kernel-labs/linux/blob/master/tools/labs/templates/assignments/0-list/list.c | list.c]]. |
+ | Folositi noua infrastructura de testare ruland comenzile de mai jos: | ||
+ | |||
+ | <code> | ||
+ | $ git clone https://github.com/linux-kernel-labs/linux.git | ||
+ | $ cd linux/tools/labs | ||
+ | $ LABS=assignments/0-list make skels | ||
+ | # scheletul de cod se va gasi in api_assignment/0-list/list.c | ||
+ | $ make build | ||
+ | $ make copy | ||
+ | $ make boot | ||
+ | </code> | ||
Modulul exportă un director numit **list** în //procfs//. Directorul conține două fișiere: | Modulul exportă un director numit **list** în //procfs//. Directorul conține două fișiere: | ||
* **management**: cu acces write-only; este interfața pentru transmiterea comenzilor către modulul de kernel | * **management**: cu acces write-only; este interfața pentru transmiterea comenzilor către modulul de kernel | ||
* **preview**: cu acces read-only; este interfața prin care se poate vizualiza conținutul intern al listei din kernel. | * **preview**: cu acces read-only; este interfața prin care se poate vizualiza conținutul intern al listei din kernel. | ||
- | [[http://elf.cs.pub.ro/so2/res/teme/list-skeleton.c|Scheletul de cod]] implementează cele două fișiere din procfs. Voi va trebui să creați o listă și să adăugați suportul pentru adăugarea și citirea datelor. Urmăriți TODOs din cod pentru detalii. | + | [[https://github.com/linux-kernel-labs/linux/blob/master/tools/labs/templates/assignments/0-list/list.c|Scheletul de cod]] implementează cele două fișiere din procfs. Voi va trebui să creați o listă și să adăugați suportul pentru adăugarea și citirea datelor. Urmăriți TODOs din cod pentru detalii. |
Pentru a interacționa cu lista din kernel, trebuie să scrieți comenzi (folosind comanda ''echo'') în fișierul ''/proc/list/management'': | Pentru a interacționa cu lista din kernel, trebuie să scrieți comenzi (folosind comanda ''echo'') în fișierul ''/proc/list/management'': | ||
Line 32: | Line 43: | ||
Vizualizarea conținutului listei se face prin vizualizarea conținutului fișierului ''/proc/list/preview'' (folosiți comanda ''cat''). Formatarea conține câte un element pe fiecare linie. | Vizualizarea conținutului listei se face prin vizualizarea conținutului fișierului ''/proc/list/preview'' (folosiți comanda ''cat''). Formatarea conține câte un element pe fiecare linie. | ||
- | <note> | ||
- | Pentru a vă asigura că modulul este compilat pentru kernel-ul pe care îl rulează mașina virtuală, trebuie să aveți ''KDIR = /usr/src/linux-so2'' în Makefile. | ||
- | </note> | ||
===== Testare ===== | ===== Testare ===== | ||
- | Pentru simplificarea procesului de corectare al temelor, dar și pentru a reduce greșelile temelor trimise, corectarea temelor se va face automat cu ajutorul unui [[http://elf.cs.pub.ro/so2/res/teme/list-checker|script de testare]] numit ''list-checker''. Scriptul de testare presupune că numele modului de kernel este denumit ''list''. | + | Pentru simplificarea procesului de corectare al temelor, dar și pentru a reduce greșelile temelor trimise, corectarea temelor se va face automat cu ajutorul unui [[https://github.com/linux-kernel-labs/linux/blob/master/tools/labs/templates/assignments/0-list/checker/_checker|script de testare]] numit ''_checker''. Scriptul de testare presupune că numele modului de kernel este denumit ''list''. |
- | + | ||
- | Scriptul ''list-checker'' trebuie descărcat și îi trebuie acordate drepturi de execuție:<code bash> | + | |
- | wget http://elf.cs.pub.ro/so2/res/teme/list-checker | + | |
- | chmod a+x list-checker | + | |
- | </code> | + | |
- | Apoi scriptul trebuie copiat în directorul ''fsimg/root/'' al [[:so2:resurse:masini-virtuale|mașinii virtuale QEMU/KVM]]. Tot acolo trebuie copiat și fișierul modul compilat ''list.ko''. După pornirea mașinii virtuale, scriptul și modulul vor fi disponibile în directorul ''/root/'' al mașinii virtuale QEMU/KVM. Pentru testare se va invoca scriptul:<code bash> | + | |
- | ./list-checker | + | |
- | </code> | + | |
<hidden> | <hidden> | ||
Line 67: | Line 67: | ||
==== Sfaturi ==== | ==== Sfaturi ==== | ||
- | Pentru a vă mări șansele de a obține nota maximă, citiți și respectați coding style-ul kernelului Linux descris din documentul [[http://lxr.free-electrons.com/source/Documentation/process/coding-style.rst | Coding Style]]. | + | Pentru a vă mări șansele de a obține nota maximă, citiți și respectați coding style-ul kernelului Linux descris din documentul [[https://elixir.bootlin.com/linux/v4.19.19/source/Documentation/process/coding-style.rst | Coding Style]]. |
De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul: | De asemenea, folosiți următoarele tool-uri de analiza statică pentru a verifica codul: | ||
Line 73: | Line 73: | ||
=== checkpatch.pl === | === checkpatch.pl === | ||
- | * <code bash> /path/to/linux-4.9.11/scripts/checkpatch.pl --no-tree --terse -f /path/to/your/list.c </code> | + | * <code bash> linux/scripts/checkpatch.pl --no-tree --terse -f /path/to/your/list.c </code> |
=== sparse === | === sparse === | ||
* <code bash> sudo apt-get install sparse </code> | * <code bash> sudo apt-get install sparse </code> | ||
* <code bash> | * <code bash> | ||
- | cd /path/to/linux-4.9.11 | + | cd linux |
make C=2 /path/to/your/list.c </code> | make C=2 /path/to/your/list.c </code> | ||
Line 99: | Line 99: | ||
<note important> | <note important> | ||
- | Resursele temei se găsesc și în repo-ul [[https://github.com/systems-cs-pub-ro/so2-assignments|so2-assignments]] de pe GitHub. Repo-ul conține și un [[https://github.com/systems-cs-pub-ro/so2-assignments/blob/master/so2-create-repo.sh|script Bash]] care vă ajută să vă creați un repository privat pe instanța de [[https://gitlab.cs.pub.ro|GitLab]] a facultății. Urmăriți indicațiile din [[https://github.com/systems-cs-pub-ro/so2-assignments/blob/master/README.md|README]] și de pe [[:so2:teme:folosire-gitlab| pagina de Wiki dedicată pentru git]]. | + | Va recomandam sa folositi gitlab pentru a va stoca temele. Urmăriți indicațiile din [[https://github.com/systems-cs-pub-ro/so2-assignments/blob/master/README.md|README]] și de pe [[:so2:teme:folosire-gitlab| pagina de Wiki dedicată pentru git]]. |
</note> | </note> | ||