parte de dezvoltare Linux modulul de kernel 12

Tip director / lib / module / `uname -r` / build / include conține fișierele necesare toate antet pentru a include definițiile din codul modulului și pentru a obține informații de fond. Numele exact al directorului depinde de versiunea kernel-ului și poate fi găsit folosind următoarea comandă:

Calcul Utilizați linkurile

Una dintre cele mai importante concepte (și este adesea atribuită extrem de complicată) în domeniul modulelor de kernel este utilizarea modulului de numărare de referință. numărul de referință este câmpul intern al descrierii modulului structurii și, în principiu, acces direct la ea nu trebuie (sau cel puțin o modalitate ușoară de a obține acest acces nu este). Când încărcați o valoare inițială a modulului de referință contorul este zero. Când încărcați modulul următor, care utilizează numele (importuri) exportate de acest modul, acest număr de referință modul este incrementat. Modul, în care contorul de utilizare nu este zero de referință, nu poate fi descărcat comanda rmmod. Acest punct este atât de atent monitorizat datorită dramatismul prezenței modulelor în sistem: o referință incorect la un modul inexistent asigură prăbușirea întregului sistem.

Luați în considerare următoarea comandă simplă:

Aici unitatea înregistrată în sistem sub numele i2c_core (acest lucru nu este numele fișierului, și este luat în mod arbitrar de numărul de module încărcate în sistem) este valoarea curentă a numărului de referință de 5, și este urmată de o listă de nume de 5 module, se leagă de el. Atâta timp cât toate aceste 5 module nu vor fi eliminate din sistem, îndepărtați modulul i2c_core va fi imposibil.

Care este confuzia menționat mai sus, referitoare la discuțiile din numărul de referință? Faptul că, în acest concept de nucleu la schimbările constante care au loc, iar acestea apar la o astfel de viteză încât literatura de specialitate și discuțiile nu sunt ținute cu ei, și astfel încât acestea descriu adesea unele mecanisme inexistente. Până în prezent, descrierile pot găsi de multe ori link-uri către MOD_INC_USE_COUNT () macro și MOD_DEC_USE_COUNT (). care crește și descrește numărul de referință. Dar aceste macro-uri au fost în kernel 2.4. În kernel-ul 2.6 au avut loc lor următoarele apeluri de funcții (definite în ):

  1. int try_module_get (struct modulul * modul) - crește numărul de referință pentru modulul (returnează un indiciu al succesului operațiunii);
  2. void module_put (struct modulul * modul) - pentru a reduce numărul de referință pentru modulul;
  3. nesemnate int module_refcount (modulul struct * mod) - returnează valoarea numărului de referință pentru modulul;

Ca o opțiune pentru toate aceste provocări sunt transmise de obicei THIS_MODULE indicatorul Const. astfel că solicită exemple, în cele din urmă, sunt după cum urmează:

Astfel, este clar că există o anumită posibilitate de a controla valoarea numărului de referință al codului de propriul modul. Ar trebui să fie făcut cu mare atenție, pentru că dacă numărul de creștere și simetric nu este redus ulterior, modulul va fi imposibil să se descarce (până când sistemul repornește). Aceasta este una dintre variantele de apariție în sistemul de module „permanente“, o altă posibilitate de apariție a acestora: un modul care nu are în caracteristicile lor de finalizare cod. În unele cazuri, poate fi necesar să se schimbe în mod dinamic numărul de referință, prevenind în momentul descărcării modulului posibil. Acest lucru este valabil, de exemplu, funcțiile care implementează operațiunile deschise () (pentru a crește contorul de referințe) și adresa e aproape () (Diminuare / restore atac contra) pentru drivere de dispozitiv, sau vor fi disponibile de descărcare modul, service un dispozitiv deschis, și după tratament (de la procesul utilizatorului spațiu) pentru a deschide dispozitivul mâner va fi trimis în memoria neinițiat!

Și aici există o altă confuzie (care poate fi văzut în codul unor module): Se recomandă o varietate de resurse, atunci când deschiderea dispozitivului pentru a crește numărul total de utilizare a modulului propriu de cod și descrească atunci când este închis. Era adevărat. dar unele versiuni ale kernel-ului (nu am putut urmări modul în care este), acest număr de urmărire de referință se realizează automat în timpul deschiderii și închiderii. Exemple de acest lucru vor fi studiate în detaliu mai târziu, atunci când se analizează mai multe dispozitive de deschidere (arhiva mopen.tgz la acest exemplu va fi prezentat într-un articol mai târziu).

concluzie