This shows you the differences between two versions of the page.
so2:laboratoare:lab04:exercitii [2018/03/13 14:35] ionel.ghita |
so2:laboratoare:lab04:exercitii [2019/03/12 21:54] (current) constantin.ghioc [1. [2p] Înregistrarea unui dispozitiv de tip caracter] |
||
---|---|---|---|
Line 83: | Line 83: | ||
</code> | </code> | ||
</note> | </note> | ||
+ | |||
+ | ===== Exerciții ===== | ||
<note warning> | <note warning> | ||
Line 92: | Line 94: | ||
</note> | </note> | ||
+ | <note important> | ||
+ | Înainte de începerea rezolvării laboratorului, rulați comanda ''%%git pull --rebase%%'' in directorul ''~/so2/linux'', pentru a obține ultima versiune a scheletului de laborator. | ||
+ | </note> | ||
===== [0.5p] Intro ===== | ===== [0.5p] Intro ===== | ||
Line 103: | Line 108: | ||
<note tip> | <note tip> | ||
- | La căutarea simbolurilor în [[https://elixir.bootlin.com/linux/v4.15/source|LXR]], asiguraţi-vă că selectaţi aceeaşi versiune de kernel ca cea din laborator(4.15). | + | La căutarea simbolurilor în [[https://elixir.bootlin.com/linux/v4.15/source|LXR]], asiguraţi-vă că selectaţi aceeaşi versiune de kernel ca cea din laborator (4.19). |
Pentru cscope, folosiți comanda '':cs f g //nume//'' pentru căutarea definiţiilor şi comanda '':cs f s //nume//'' pentru căutarea simbolurilor. Pentru mai multe informaţii despre comenzile disponibile folosiţi comanda '':help cscope''. | Pentru cscope, folosiți comanda '':cs f g //nume//'' pentru căutarea definiţiilor şi comanda '':cs f s //nume//'' pentru căutarea simbolurilor. Pentru mai multe informaţii despre comenzile disponibile folosiţi comanda '':help cscope''. | ||
Line 110: | Line 115: | ||
===== [10.5p] Character Device Driver ===== | ===== [10.5p] Character Device Driver ===== | ||
- | ==== 1. [1p] Înregistrarea unui dispozitiv de tip caracter ==== | + | ==== 1. [2p] Înregistrarea unui dispozitiv de tip caracter ==== |
Driver-ul va controla un singur dispozitiv cu majorul ''MY_MAJOR'' și minorul ''MY_MINOR ''(macro-urile definite în fișierul ''kernel/so2_cdev.c'') Ca prim pas, va trebui să creați fișierul de tip caracter ''/dev/so2_cdev'' folosind utilitarul ''mknod''. | Driver-ul va controla un singur dispozitiv cu majorul ''MY_MAJOR'' și minorul ''MY_MINOR ''(macro-urile definite în fișierul ''kernel/so2_cdev.c'') Ca prim pas, va trebui să creați fișierul de tip caracter ''/dev/so2_cdev'' folosind utilitarul ''mknod''. | ||
Line 127: | Line 132: | ||
</note> | </note> | ||
- | Afișati, folosind macro-ul ''LOG_LEVEL'', un mesaj după operațiile de înregistrare, respectiv deînregistrare, care să confirme realizarea cu succes a acestora. | + | Afișati, folosind ''pr_info'', un mesaj după operațiile de înregistrare, respectiv deînregistrare, care să confirme realizarea cu succes a acestora. |
Încărcați apoi modulul în kernel<code> | Încărcați apoi modulul în kernel<code> | ||
Line 249: | Line 254: | ||
</note> | </note> | ||
- | ==== 7. [2p] Operație de tip ''ioctl''. ==== | + | ==== 7. [1p] Operație de tip ''ioctl''. ==== |
Pentru acest exercițiu dorim să adăugăm operația ioctl ''MY_IOCTL_PRINT'' care să afișeze mesajul dat de macro-ul ''IOCTL_MESSAGE'' din driver. Urmăriți comentariile marcate cu ''TODO 6''. | Pentru acest exercițiu dorim să adăugăm operația ioctl ''MY_IOCTL_PRINT'' care să afișeze mesajul dat de macro-ul ''IOCTL_MESSAGE'' din driver. Urmăriți comentariile marcate cu ''TODO 6''. | ||
Line 255: | Line 260: | ||
Pentru aceasta: | Pentru aceasta: | ||
- Implementați funcția ''ioctl'' în driver. | - Implementați funcția ''ioctl'' în driver. | ||
- | - Trebuie să scrieți un program în user-space (''user/so2_cdev_test.c'') care să apeleze funcția ''ioctl'' cu parametrii corespunzători. În fișierul de testare trebuie să apelați ''ioctl'' pentru fișierul dispozitivului. | ||
- Folosiți ''printk'' pentru a afișa mesajul din driver. | - Folosiți ''printk'' pentru a afișa mesajul din driver. | ||
+ | - Pentru testare, vom folosi un program în user-space (''user/so2_cdev_test.c'') care să apeleze funcția ''ioctl'' cu parametrii corespunzători. | ||
<note tip> | <note tip> | ||
- | Macrodefiniția ''MY_IOCTL_PRINT'' este definită în fișierul ''include/so2_cdev.h'' din [[http://elf.cs.pub.ro/so2/res/laboratoare/lab04-tasks.zip|arhiva de sarcini]] a laboratorului (folosește ''_IOC'' pentru a defini operația) | + | Macrodefiniția ''MY_IOCTL_PRINT'' este definită în fișierul ''include/so2_cdev.h'' din scheletul laboratorului (folosește ''_IOC'' pentru a defini operația). Acest fișier antet este inclus de ambele fișiere sursă (modulul de kernel și programul de test din user space). |
Citiți secțiunile [[:so2:laboratoare:lab04#ioctl|ioctl]] și [[:so2:laboratoare:lab04#open și release|open și release]] din laborator. | Citiți secțiunile [[:so2:laboratoare:lab04#ioctl|ioctl]] și [[:so2:laboratoare:lab04#open și release|open și release]] din laborator. | ||
Line 265: | Line 270: | ||
<note tip> | <note tip> | ||
- | Pentru a compila codul sursă de user space folosiți compilatorul ''gcc-5''. Pentru aceasta rulați comanda:<code> | + | Codul sursă de user space este compilat automat în momentul în care rulați ''make build''. După ''make copy'', veți găsi executabilul în directorul ''/home/root/skels/device_drivers/user''. |
- | /usr/bin/gcc-5 -m32 -static -Wall -g -o so2_cdev_test so2_cdev_test.c | + | |
- | </code> | + | |
- | + | ||
- | Executabilul rezultat trebuie să îl copiați pe mașina virtuală la fel ca modulul de kernel și să îl rulați pe mașina virtuală pentru a valida implementarea corectă a ''ioctl''. | + | |
</note> | </note> | ||
Line 275: | Line 276: | ||
==== Extra ==== | ==== Extra ==== | ||
- | <note>Urmăriți comentariile marcate cu ''TODO 7''</note>. | + | <note>Urmăriți comentariile marcate cu ''TODO 7''.</note> |
1. (**2 karma**) Ioctl cu transmitere de mesaje | 1. (**2 karma**) Ioctl cu transmitere de mesaje |