This shows you the differences between two versions of the page.
|
so2:teme:tema0 [2018/02/21 17:00] alexandru.elisei [Enunț] |
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]]. |
| - | <note>Pentru compilarea scheletului e nevoie sa fie inlocuit in fisierul list-skeleton.c header-ul asm/uaccess.h cu linux/uaccess.h</note> | + | 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 34: | 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 69: | 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 75: | 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 101: | 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> | ||