This shows you the differences between two versions of the page.
so2:laboratoare:lab03:exercitii [2018/03/06 22:56] anda.nicolae [7. [1p] Testare modul de lucru cu liste] |
so2:laboratoare:lab03:exercitii [2018/03/06 23:09] (current) anda.nicolae [2. [1p] Folosirea de operații blocante în context atomic] |
||
---|---|---|---|
Line 123: | Line 123: | ||
==== 2. [1p] Folosirea de operații blocante în context atomic ==== | ==== 2. [1p] Folosirea de operații blocante în context atomic ==== | ||
- | Intrați în directorul ''2-sched-spin/'' și parcurgeți conținutul fișierului ''sched-spin.c''. **Hint**: Funcția [[http://elixir.bootlin.com/linux/v4.9/source/kernel/time/timer.c?#L1697|schedule_timeout]], coroborată cu macro-ul [[http://elixir.bootlin.com/linux/v4.9/source/include/linux/sched.h?#L297|set_current_state]], forțează procesul curent să aștepte 5 secunde. | + | Intrați în directorul ''2-sched-spin/'' și parcurgeți conținutul fișierului ''sched-spin.c''. **Hint**: Funcția [[https://elixir.bootlin.com/linux/v4.15.7/source/kernel/time/timer.c#L1725|schedule_timeout]], coroborată cu macro-ul [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/sched.h#L128|set_current_state]], forțează procesul curent să aștepte 5 secunde. |
- Compilați codul sursă într-un modul de kernel și copiați-l pe mașina virtuală, conform informațiilor de mai sus (''make build'' și ''make copy''). | - Compilați codul sursă într-un modul de kernel și copiați-l pe mașina virtuală, conform informațiilor de mai sus (''make build'' și ''make copy''). | ||
- Încărcați modulul în kernel folosind comanda ''insmod sched-spin.ko''. | - Încărcați modulul în kernel folosind comanda ''insmod sched-spin.ko''. | ||
Line 146: | Line 146: | ||
- (**TODO 2**) Folosiți funcția completată anterior pentru a inițializa cele 4 structuri cu următoarele informații: | - (**TODO 2**) Folosiți funcția completată anterior pentru a inițializa cele 4 structuri cu următoarele informații: | ||
* PID-ul procesului curent, dat de macro-ul ''current'', de tipul ''struct task_struct *''. | * PID-ul procesului curent, dat de macro-ul ''current'', de tipul ''struct task_struct *''. | ||
- | * **Hint**: Căutați câmpul relevant pentru PID în structura [[http://elixir.bootlin.com/linux/v4.9/source/include/linux/sched.h?#L1475|task_struct]]. | + | * **Hint**: Căutați câmpul relevant pentru PID în structura [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/sched.h#L520|task_struct]]. |
* PID-ul procesului părinte al procesului curent. | * PID-ul procesului părinte al procesului curent. | ||
* **Hints**: | * **Hints**: | ||
- | * Căutați câmpul relevant din structura [[http://elixir.bootlin.com/linux/v4.9/source/include/linux/sched.h?#L1475|task_struct]]. | + | * Căutați câmpul relevant din structura [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/sched.h#L520|task_struct]]. |
* Căutați după șirul "parent". | * Căutați după șirul "parent". | ||
* PID-ul procesului următor din lista de procese. | * PID-ul procesului următor din lista de procese. | ||
* **Hints**: | * **Hints**: | ||
- | * Folosiți macro-ul [[http://elixir.bootlin.com/linux/v4.9/source/include/linux/sched.h?#L2990|next_task]]. | + | * Folosiți macro-ul [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/sched/signal.h#L500|next_task]]. |
* Macro-ul întoarce pointer-ul la următorul proces, adică de tipul ''struct task_struct *''. | * Macro-ul întoarce pointer-ul la următorul proces, adică de tipul ''struct task_struct *''. | ||
* PID-ul următorului proces după următorul. | * PID-ul următorului proces după următorul. | ||
- | * **Hint**: Folosiți de două ori macro-ul [[http://elixir.bootlin.com/linux/v4.9/source/include/linux/sched.h?#L2990|next_task]]. | + | * **Hint**: Folosiți de două ori macro-ul [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/sched/signal.h#L500|next_task]]. |
- (**TODO 3**) Afișați cele patru structuri. | - (**TODO 3**) Afișați cele patru structuri. | ||
* Folosiți ''printk'' pentru a afișa cele două câmpuri ale acestora: ''pid'' și ''timestamp''. | * Folosiți ''printk'' pentru a afișa cele două câmpuri ale acestora: ''pid'' și ''timestamp''. | ||
Line 185: | Line 185: | ||
Revedeți secțiunea [[:so2:laboratoare:lab03#Liste|Liste]] din laborator. | Revedeți secțiunea [[:so2:laboratoare:lab03#Liste|Liste]] din laborator. | ||
- | Atunci când ștergeți elemente din listă, va trebui să folosiți apelul [[http://elixir.bootlin.com/linux/v4.9/source/include/linux/list.h?#L422|list_for_each_safe]]. Puteți folosi și apelul [[http://elixir.bootlin.com/linux/v4.9/source/include/linux/list.h?#L516|list_for_each_entry_safe]]. | + | Atunci când ștergeți elemente din listă, va trebui să folosiți apelul [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/list.h#L436|list_for_each_safe]]. Puteți folosi și apelul [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/list.h#L543|list_for_each_entry_safe]]. |
</note> | </note> | ||
Line 227: | Line 227: | ||
Pentru exportarea funcțiilor de mai sus, din modulul de la ''6-list-sync/'' este nevoie de următorii pași: | Pentru exportarea funcțiilor de mai sus, din modulul de la ''6-list-sync/'' este nevoie de următorii pași: | ||
- Funcțiile nu trebuie să fie statice. | - Funcțiile nu trebuie să fie statice. | ||
- | - Se folosește macro-ul [[EXPORT_SYMBOL|https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/export.h#L77]] pentru a exporta simbolurile în kernel. De exemplu: ''EXPORT_SYMBOL(task_info_remove_expired);''. Macro-ul trebuie folosit pentru fiecare funcție, **după** definirea funcției. | + | - Se folosește macro-ul [[https://elixir.bootlin.com/linux/v4.15.7/source/include/linux/export.h#L77|EXPORT_SYMBOL]] pentru a exporta simbolurile în kernel. De exemplu: ''EXPORT_SYMBOL(task_info_remove_expired);''. Macro-ul trebuie folosit pentru fiecare funcție, **după** definirea funcției. |
- Eliminați din modulul de la ''6-list-sync/'' secvența cu evitarea expirării unui element al listei (se bate cap în cap cu ce face testul). | - Eliminați din modulul de la ''6-list-sync/'' secvența cu evitarea expirării unui element al listei (se bate cap în cap cu ce face testul). | ||
- Compilați și încărcați modulul de la ''6-list-sync/''. Odată încărcat va expune funcțiile exportate și vor putea fi folosite de modulul de test. Puteţi verifica acest lucru căutând numele funcţiilor în ''/proc/kallsyms'' înainte şi după încărcarea modulului. | - Compilați și încărcați modulul de la ''6-list-sync/''. Odată încărcat va expune funcțiile exportate și vor putea fi folosite de modulul de test. Puteţi verifica acest lucru căutând numele funcţiilor în ''/proc/kallsyms'' înainte şi după încărcarea modulului. |