[so2] submodule (simboluri statice?)

Octavian Crintea octavian.crintea at gmail.com
Mon Mar 23 17:18:54 EET 2015


2015-03-20 17:12 GMT+02:00 Razvan Deaconescu via so2 <so2 at cursuri.cs.pub.ro>:
> Mihail Bălan via so2 <so2 at cursuri.cs.pub.ro> writes:
>> Vreau să-mi sparg modulul în mai multe submodule. Motivul: vreau să separ
>> (din punct de vedere al surselor) funcționalități: e.g.: lucrul cu deviceuri,
>> managementul listelor, logica principală.
>>
>> Funcțiile și variabilele globale (*) pe care le folosesc doar în acest modul
>> sunt statice.  Am mai multe opțiuni:
>>
>> 1) fac funcțiile și variabilele globale non-statice. Dezavantaj: simboluri
>> exportate în întreg kernel-ul.
>>
>> 2) renunț la submodule, dar definesc funcțiile și variabile în mai multe
>> header-e. Cum doar modulul meu încarcă aceste header-e o singură dată, le pot
>> lăsa statice. Dezavantaj: definiții în header-e...
>>
>> 3) Renunț și las totul într-un singură sursă.
>>
>> Din punctul meu de vedere ar fi ideal dacă s-ar putea creea simboluri care să
>> fie external-linked în submodule (pentru a putea fi linkate când se
>> compilează modulul), dar să fie internal linked în modulul final. Dar, decât
>> dacă sub-modulele și modulele se compilează cu un fel de black-magic, nu văd
>> cum ar fi posibil așa ceva.
>>
>> Care ar fi opțiunea cea mai bună?
>>
>> * în general evit variabilele globale, dar într-un modul de kernel nu văd o
>> soluție elegantă de a le evita; e.g. e nevoie de o variabile globala pentru
>> santinela unei liste folosite în modul. Dacă variabile e statică nu văd nicio
>> problemă. Dacă nu e statică...
>
> Păi ar trebui să nu ai nevoie să folosești variabile globale în mai
> multe submodule. Pur și simplu le faci globale statice și, dacă e musai
> nevoie să fie folosită o variabilă și în alt modul, o trimiți ca
> parametru unei funcții din acel modul. Cred că poți să rezolvi așa, fără
> a fi nevoie de globale ne-statice.
>
> Răzvan

Întrebarea cred că se referea la cum se poate compune un modul de
kernel din mai multe module obiect (numite și fișiere obiect),
rezultate din compilarea multiplelor surse, fără a exporta in kernel
funcțiile și variabilele externe folosite între aceste modulele
obiect.  Răspunsul e că se compilează în mod obișnuit sursele și se
leagă totul în modulul de kernel (.ko).  Niciun simbol nu va fi
exportat, chiar dacă e declarat nestatic.  Exportarea se face la
cerere, folosind primitiva EXPORT_SYMBOL.

Pe scurt, cuvântul cheie static nu acționează la nivel de kernel, ci
la nivel de modul de kernel.  La fel și extern.

Octavian


More information about the so2 mailing list