Overview

Tema 1 SO2  |
Linux       |  Iulius Curt  343 C3
----------------------------------


Compilare:
    - make

Rulare (exemplu workflow cu ajutorul testerului):
    - insmod sci.ko
    - ./test intercept 5 0  # Incepe interceptarea syscall 5 (open)
    - ./test start 5 0 0  # Incepe monitorizarea syscall 5 pe toate procesele
    - ./test stop 5 0 0
    - ./test release 5 0  # Inceteaza interceptarea syscall 5
    - rmmod sci


Surse:
    - sci.c  - Implementare Linux
    - sci.h  - Structuri si macrouri generice (independente de platforma)
    - sci_lin.h  - Structuri si macrouri specifice Linux


Nota: pentru folosirea 'print_list' se defineste:
    #define DEBUG 1

Scurta descriere a functiilor:
    - sci_init  - initializarea modulului
    - sci_exit  - finalizarea modulului
    - my_syscall  - raspunde la syscall specific modulului (MY_SYSCALL_NO)
                  - primeste comenzi din userspace si controleaza interceptarea
    - interceptor  - apelata in locul syscall-urilor, logheaza si apeleaza
                     mai departe syscall-ul original
    - sci_exit_group  - inlocuieste apelul sys_exit_group, elimina procesul
                        incheiat din liste si apeleaza sys_exit_group original
    - [functii de lucru cu liste]

Sincronizare:
    - In functiile de initializare si distrugere a modulului nu e necesara
      sincronizarea pentru ca ele nu pot fi apelate de mai multe ori simultan.
      Cat despre conditiile de cursa cu alte eventuale module/procese care vor
      sa modifice tabela de syscall-uri, absenta unui mijloc de sincronizare
      pare a fi unul din motivele pentru care s-a dezexportat tabela in kernel.
      (http://lwn.net/Articles/12211/)
    - Trei lockuri in total:
        - Spinlock pentru accesul la tabela de syscall-uri
        - Semafor (mutex) pentru accesul la datele din structura de
          monitorizare a fiecarui syscall, exceptand listele de procese
        - Semafor (mutex) separat pentru accesul la listele de procese