Asamblarea modulelor de kernel
Kernel Module [citare]
Nucleul Linux conține o mulțime de cod care acceptă o anumită caracteristică sau echipament. Cea mai mare parte a codului (de obicei, codul de suport procesor, memorie, și alte elemente de bază) compilat în kernel, și pentru a boota de la ea, și o parte din cod, este necesar doar pentru unii utilizatori - drivere de dispozitiv, fișiere suport sisteme, etc. - asamblate ca module.
Modulele pot fi conectate la miezul de comandă a utilizatorului (modprobe. Insmod) sau în mod automat de către udev, și să fie evacuate fie de către kernel-ul sau comanda rmmod.
Majoritatea modulelor este în pachetul de nucleu, dar, din motive tehnice, uneori, administrative sau juridice, unele module sunt colectate separat.
Pe module și numele [modifică]
Ca și în magazia poate fi de mai multe nuclee, module sunt un mod special: există un pachet cu codul sursă, și pachete cu module compilate pentru un nucleu specific. În acest ultim SRPM conține doar .spec și patch-uri, precum și codul sursă primit de constrângeri de asamblare. Astfel, pentru modulul și nucleul versiunii modulului de aromă avem pachete cu nume
- kernel-source module - acesta conține numai surse
- kernel-module-module -flavour - Modul de modul. aromă asamblate la miez (de exemplu, kernel-module-nvidia-std-def)
Pachete de eliberare câmp plin cu module astfel: alt
- Eliberați modulul în sine, adică, dacă am actualizat numele modulului, modificările de câmp; - versiune a kernel-ului în forma (2 ^ 16) * majore + (2 ^ 8) * la mijlocul + minor. adică 2.6.25 = 132633. Nu-ți face griji, se calculează numărul de script-ul, descris mai târziu; - Eliberarea pachetului de nucleu.
De exemplu, un modul de kernel nvidia kernel-image-std-def-2.6.25-alt8 fi numit kernel-module-nvidia-std-def-173.14.12-alt1.132633.8.
Cum de a asambla un modul local [edita]
Această fază este necesară în principal pentru testarea modulului, și, în general, nu este necesară, dar este utilă pentru înțelegerea procesului.
Ceea ce avem nevoie [necesită citare]
În plus față de GCC, face și alte lucruri de asamblare standard, de care avem nevoie pentru a kernel-headers-module-
Asamblare [citare]
Descărcați și extrageți codul sursă al modulului, vom descoperi că pur și simplu face, de obicei, nu funcționează. Această problemă este specifică Sisif / ALT Linux și este necesar pentru asamblarea anteturile de kernel module care sunt căutate în directorul / lib / modules /
Pentru a rezolva această problemă, aveți nevoie pentru a trece peste o variabilă (de obicei, KERNELSOURCE sau KSRC) în Makefile. Apoi rulați asamblare, de exemplu, face KSRC = / usr / src / linux-2.6.25-std-def. De obicei, modulul apoi colectate.
Unitatea asamblată poate încerca să se încarce prin intermediul insmod. sau să-l pună celelalte module de kernel în / lib / module /
Cum de a asambla unitatea în mod corespunzător [modifică]
De ce metoda anterioară nu este corect? Pentru că el nedistributiven. Pentru asamblare corectă, avem nevoie de:
Șabloanele [citare]
Deoarece specificațiile din dreapta ale fiecărui pachet cu module pentru fiecare versiune a kernel-ului un pic prost, sistemul a fost dezvoltat, în care fiecare modul creează un șablon și roată (folosind directiva specsubst. Menționarea miez de aromă) personaliza acest șablon la un nucleu specific (inclusiv Se calculează de eliberare a modulului). Restul lucrării cade pe% setup_kernel_module macro. care calculează toți ceilalți parametri care sunt necesare pentru asamblarea modulului: versiunea kernel-ului, eliberarea modulul de kernel și eliberați. Sami template-uri sunt stocate în git-depozit, care are o mulțime de ramuri, ramuri template-uri sunt numite șablon / modul / distro. în cazul în care modulul - este numele real al modulului (de exemplu, nvidia) și distro - este sub pe care le colectăm. De obicei, Sisif. dar, ca și pentru diferite modele de brunch-uri trebuie să se schimbe, puteți instala câmpul distro la valoarea corespunzătoare. De obicei, distro este acum la fel ca și numele brunch.
Pregătirea directorului de lucru [modifică]
Vom avea nevoie de un utilitar de km de-a crea tag-ul pentru a construi module din pachetul kernel-build-unelte.
Pentru a utiliza șabloanele au Prânzul cu ei pentru a începe la nivel local, de exemplu:
Asamblarea modulului din șablon (folosind viteze specsubst) [regula]
Când colectați la nivel local în scopuri de testare, este convenabil să se instaleze parametrul gear.specsubst.kflavour în kernel:
Puteți asambla apoi modulul cu comanda:
Crearea de etichete pentru asamblare pe git.alt (schema de viteze-specsubst) [regula]
De exemplu, pentru a crea o etichetă pentru modulul nvidia, asamblate la miezul std-def:
Sau, pentru a crea etichete pentru toate modulele care se pot face:
Module de asamblare git.alt [regula]
După aceea vă puteți împinge brunch și tag-uri primite pe git.alt.
și se adaugă la lista de module ultimei task'u (care se presupune ca a fost deja adăugat pentru a asambla corespunzătoare kernel-image):
Cu toate acestea, ar trebui să se țină seama de faptul că updatemodules și km-create-tag-ul nu a freca curata / fișier taglist și trebuie să-l faci manual.
Dacă actualizați miezul, dar nu intenționează să actualizeze șabloanele module, puteți face:
$ Sst sarcină git.alt adăuga [numărul de locuri de muncă] kmodules std-def
se va adăuga la locul de muncă (care se presupune ca a fost deja adăugat pentru a asambla corespunzător kernel-image), toate modulele compilate pentru core-def std.
Unele moment, [regulă]
- În cazul în care depozitul: kernel-image-std-def-3.0.4-alt0.M60P.1.i586.rpm
- Apoi, în numele pachetului: kernel-module-emlog-std-def-0,51-alt2.196612.0.M60P.1.i586.rpm
Versiunea de eliberare a modulului este ambalat + versiune de kernel. SCARY?
Rebuild un modul singur [necesită citare]
Să presupunem că aveți nevoie pentru a reconstrui magazia într-un modul fără a reconstrui kernel-ul și toate modulele.
- Modificare șablon ramură / RT3070 / Sisif, comite modificările noastre
- km-crea tag-ul -k-def std RT3070
- verificați de asamblare ceva de genul: unelte -t $ (Git descrie) --hasher - HSH $ TMP /
ansamblul nou modul [edita]
Asamblarea kernel-source-modul [regula]
În primul rând, ar trebui să construiască o sursă de modul pachet. Acest pachet este simplu, și, de fapt conține ambalate doar codul sursă, iar asamblarea sa este doar zapakovke. De exemplu, mai bine să ia ceva simplu și gata făcute, de exemplu, face acest lucru:
Editați imaginea și asemănarea .spec kernel-source module - de obicei, este necesar să se înlocuiască numele modulului, versiunea, descrierea și changelog, și de a construi in sine, de obicei, nu se poate atinge.
În continuare, vom colecta un pachet folosind uneltele. Ca urmare, pachetul ar trebui să fie doar un singur fișier, și anume, / usr / src / kernel / surse / kernel-source-modulul .tar.bz2
Vă rugăm să rețineți că unele pachete de sursă în numele său conține versiunea. de exemplu, kernel-source-kdbus-5.0.0.31-5.0.0.31-Alt1. Acest lucru se face pentru a putea fi în măsură să colecteze boabe de diferite, cu diferite versiuni ale modulelor (de exemplu, noile module nu vor 2.6.18).
Crearea unui nou șablon [edita]
După ansamblul pachetului cu codul sursă, avem nevoie pentru a crea o nouă sucursală în magazia cu modulele:
în cazul în care modulul - numele modulului tau.
Acum, editați spec, modificați numele, versiunea, descriere, cheyndzhlog poate fi necesar pentru a ajusta opțiunile pentru ansamblul. Și se angajează:
Notă intrarea changelog superioară ar trebui să rămână neschimbate și constau din aceste macro-uri teribile, din care este, în orice modul de kernel în orice ALT real depozit
Cum de a pune modulul în depozit [edit]
Plasarea modulelor nu este diferită de pachete convenționale vykladyvaniya.
Puneți modulul în sine:
Încă nevoie de pachete prin git.alt.
Notă importantă: pentru adunarea a avut loc în mod corect, kernel-sursă modul trebuie să fie compilate pentru a construi kernel-module-modul.
Recomandări pentru interacțiunea cu menținător nuclee [citare]
Pentru munca în comun normală, se recomandă:
- La actualizarea modulului pentru a actualiza ansamblul sub numărul maxim de nuclee
- actualizați IMEDIAT șabloanele în magazia de pe git.alt
- Anunță intretinatorii de kernel (dez-kernel liste de distribuție), care este unitatea,
- Configurarea GIT la distanță kernel-module pe alte intretinatorii,
- Câmpul-nucleu module- Speck Packager set echipa de Kernel pentru întreținerea.
Despre symvers și module depind de alte module [edita]
Uneori se întâmplă ca un pachet cu modulele trebuie să fie colectate în conformitate cu un alt pachet cu module. De exemplu prosihodit cu gspca și v4l. Pentru asamblare corectă, avem nevoie de două lucruri: în primul rând, dreptul de a pune în jos, în funcție de antetele (de la v4l are anteturile), și în al doilea rând, trebuie să importați symvers fișiere. In problema gscpca a fost rezolvată prin adăugarea următoarelor linii la gspca de pachete% prep modulul faza: