Skip to content

Lab03 device drivers#3

Open
maranicolae wants to merge 2 commits intomasterfrom
lab03_device_drivers
Open

Lab03 device drivers#3
maranicolae wants to merge 2 commits intomasterfrom
lab03_device_drivers

Conversation

@maranicolae
Copy link
Owner

Laborator 3:

Exercițiul 1:

  1. Am utilizat comanda mknod /dev/so2_cdev c 42 0 și am verficat corectitudinea acesteia cu ls -la /dev/ | grep so2 și am obținut:
    crw-r--r-- 1 root root 42, 0 Mar 18 07:23 so2_cdev

2) + 3) Register: register_chrdev_region(MKDEV(MY_MAJOR, MY_MINOR), NUM_MINORS, "so2_cdev");
Unregister: unregister_chrdev_region(MKDEV(MY_MAJOR, MY_MINOR), NUM_MINORS);

Am verificat corectitudinea urmărind mesajele de "Hello" și "Goodbye" când am dat load (insmod) și unload (rmmod) modulului. De asemenea, am găsit so2_cdev la rularea /proc/devices | less.

Exercițiul 2:
Am rulat cât /proc/devices pentru a identifica un major ce deja este utilizat. Am modificat MY_MAJOR cu valoarea 229. Am dat load modulului și am primit exit code 16 cu echo $? (Device or resource busy).

Exercițiul 3:
Am completat comentariile TODO:

  • adăugarea câmpului cdev în interiorul structurii
  • adăugarea în fops a operațiilor corespunzătoare pentru open și release (ce încă nu sunt finalizate)
  • initializarea device-urilor (cdev_init) și notificarea kernelului (cdev_add)
  • ștergerea device-urilor (cdev_del)

Exercițiul 4:

  • setarea variabilei is_opened la 0 în init (resursa disponibila)
  • extragerea informațiilor asociate device-ului folosind container_of
  • verificarea variabilei atomice is_opened pentru a garanta că resursele nu sunt deja ocupate în funtia de open
  • setarea vaiabilei is_opened la 0 pentru a permite acces ulterior în funcția de release

Exercițiul 5:

  • asocierea funcției read în fops
  • copierea contentului din kernel buffer în ușer buffer folosind copy_to_user

Exercițiul 6:

  • asemănător cu exercițiul 5

Exercițiul 7:
Am afișat IOCTL_MESSAGE pe ramura ce verifica valoarea parametrului formal cmd să fie egala cu MY_IOCTL_PRINT. Output-ul comenzii ./so2_cdev_test p este:
Device opened!
Hello ioctl
Device closed!

Extra:

  1. Am aduagat două noi ramuri în switch pentru citire și scriere. Am efectuat apoi operații de copiere în/din arg pentru a simula operații de scriere și citire. Am verficat outputul pentru corectitudine:
    write:
    ./so2_cdev_test s anaaremeremulte
    Device opened!
    Extra write
    Device closed!

read:
./so2_cdev_test g
Device opened!
Extra read
IOCTL buffer contains anaaremeremulte
Device closed!

  1. Am declarat un wait_queue_head_t și o variabila de int pentru flag. După aceea am adăugat doua noi ramuri în switch-ul funcției ioctl ce se vor ocupa de adăugarea și ștergerea unui proces în coada. Fiecare device vă inițializa coada și flag-ul. Am comentat liniile 69-70, dar am întâmpinat probleme la testare:
    BUG: spinlock bad magic on CPU#0, so2_cdev_test/236

Signed-off-by: Mara <maraioana9967@gmail.com>
Signed-off-by: Mara <maraioana9967@gmail.com>
@dbaluta
Copy link

dbaluta commented Mar 22, 2022

Multumesc! Arata super!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants