CATEGORII DOCUMENTE |
Principalul motiv pentru care se doreste compilarea kernel-ului este adaptarea acestuia la un anumit sistem cu scopul cresterii performantelor, adaptare care de obicei consta in:
In cazul kernel-ului Linux, suportul pentru hardware/software poate sa fie:
Desi adaugarea functionalitatilor in kernel poate duce la cresterea eficientei in anumite subsisteme, acest lucru poate avea ca si consecinta ingreunarea sistemului in ansamblu (bloated), lucru nerecomandat.
Majoritatea distributiilor includ in kernel numai suportul pentru componentele critice, fara de care sistemul de operare nu poate functiona. Restul componentelor sunt compilate sub forma de module, module care sunt incarcate in functie de hardware-ul/necesitatile fiecarui sistem/utilizator.
Exista si situatii in care kernel-ul care vine cu o anumita distributie este mai vechi sau nu are compilat suportul pentru o anumita componenta. De asemenea, compilarea unui kernel optimizat este foarte intalnita pe sistemele care ruleaza server-e unde se doreste exploatarea la maxim a resurselor sistemului.
Pentru a putea efectua modificari de tipul celor mentionate mai sus, trebuie initial efectuata configurarea kernel-ului. Dupa aceasta etapa se poate porni compilarea kernel-ului si a modulelor de kernel.
Inaintea compilarii kernel-ului trebuie verificat sistemul daca satisface cerintele hardware si software.
Din punct de vedere hardware
Timpul de compilare variaza in functie de numarul de componente activate pentru compilare in momentul configurarii.
Compilarea se poate realiza pe un sistem mai puternic urmand ca apoi sa se mute pachetul ce contine kernel-ul pe sistemul destinatie.
Cerintele software pentru kernel-ul de compilat se gasesc precizate in fisierul Documentation/Changes din cadrul surselor:
o Gnu C 3.2 # gcc --versionObservatii:
Un kernel compilat poate oferi suport doar pentru hardware-ul utilizatorului, micsorand astfel dimensiunea imaginii obtinute. De asemenea, cunoasterea hardware-ului in sistem este necesara pentru un kernel mai rapid si alegerea optiunilor de compilare si a driver-elor de dispozitiv corecte. Informatii despre controller-ele Ethernet, VGA, placa de sunet se afla cu ajutorul comenzii lspci (din pachetul pciutils):
# lspciTipul procesorului se afla cu ajutorul procfs (montat in /proc).
# cat /proc/cpuinfoSursele de kernel de Linux pot fi obtinute din pachete specifice distributiei sau pot fi descarcate sursele oficiale ale lui Linus Torvalds
In cazul in care se alege varianta folosirii surselor oficiale, se recomanda folosirea unui mirror din Romania
Sursele kernel-ului se gasesc in subdirectorul /pub/linux/kernel/v2.6 (pentru versiunea 2.6). Se poate folosi http sau ftp pentru obtinerea surselor:
# cd /usr/srcSe dezarhiveaza sursele. Se recomanda crearea unei legaturi simbolice cu numele linux catre directorul ce contine sursele.
# cd /usr/srcKernel-ul compilat de pe masina virtuala de Linux disponibila pe site este un kernel 2.6.24.2.
Partea de configurare este partea cea mai importanta a procesului de compilare. In cadrul acesteia se decide ce caracteristici vor fi incluse in noul kernel; sunt necesare cunostinte ale hardware-ului sistemului si ale facilitatilor dorite.
Procesul de configurare era unul destul de dificil de realizat la primele versiuni, insa acest lucru s-a schimbat o data cu introducerea unor interfete care folosesc X Window sau ncurses. Pentru verificarea optiunilor posibile de compilare se poate rula comanda:
# make helpPentru utilizarea unei interfete text-based (ncurses), va trebui instalat pachetul libncurses-dev. Pentru utilizarea unei interfete folosind front-end GTK (de obicei intr-un desktop environment GNOME) vor trebui instalate pachetele libgtk2.0-dev si libglade2.0-dev. Pentru QT va trebui instalat pachetul libqt4-dev.
Avantajul folosirii interfetei ncurses este faptul ca este relativ usor de utilizat si nu necesita prezenta unui mediu grafic.
In cazul in care sursele contineau o configuratie anterioara care nu mai este dorita, va trebui rulata una din comenzile:
# make cleanRularea uneia dintre comenzile:
# make menuconfigrezulta in afisarea unui meniu. Acesta contine mai multe intrari de configurare (General setup, Networking, Device drivers, File systems, etc.) care pot fi utilizate pentru configurari ale unui subdomeniu. Acestea pot contine, la randul lor, alte subdomenii de configurare.
O optiune finita de configurare (spre
exemplu Device Drivers -> Block Devices ->
Compilarea built-in inseamna introducerea codului obiect asociat optiunii in imaginea de kernel care va rezulta. Compilarea in forma de modul de kernel inseamna ca pentru activarea acelei facilitati, kernel-ul va incarca modulul (codul obiect asociat) si il va descarca atunci cand nu are nevoie de el. Kernel-ul este astfel extensibil si pentru adaugarea anumitor facilitati nu este nevoie de recompilare. Pentru lucrul cu module de kernel vor trebui adaugate optiunile din Loadable module support (Enable loadable module support).
Multe optiuni nu vor fi incorporate in cadrul kernel-ului intrucat nu sunt necesare. Altele pot fi compilate numai built-in. Optiunile care suporta varianta modul de kernel sau built-in se recomanda a fi compilate ca module de kernel pentru a fi incarcate la nevoie. Pe procesoarele moderne, timpul in care se incarca/descarca module este suficient de mic incat compilarea ca modul de kernel sau built-in sa nu afecteze performanta.
O optiune utila este precizarea unei versiuni locale pentru kernel, astfel incat acesta sa fie identificat; exista posibilitatea compilarii aceleiasi versiuni de kernel pentru scopuri distincte; oferirea unei versiuni locale genereaza o versiune de kernel unica.
Precizarea tipului de procesor si a arhitecturii este un pas necesar pentru a crea un kernel eficient. Majoritatea optiunilor tin de preferintele utilizatorilor (desi probabil multi vor alege suport de networking, sunet etc.) sau de hardware-ul existent.
Daca se doreste crearea unui kernel pentru dezvoltare (development) atunci vor trebui activate optiunile din Kernel hacking; acestea ofera informatii de debug suplimentare, cu dezavantajul unui kernel mai mare si mai lent.
Configuratia este salvata in cadrul fisierului .config din directorul radacina al surselor. Este indicat sa se realizeze un backup al acestui fisier inainte de configurare pentru a avea o configuratie sigura la care sa se revina in cazul aparitiei de probleme.
initrd (initial ramdisk) este un sistem de fisiere temporar avand ca suport memoria RAM (ramdisk) care este folosit la pornirea sistemului (booting). Initrd este folosit pentru a incarca driver-ele necesare incarcarii sistemului de fisiere radacina.
Motivatia folosirii initrd este flexibilitatea. Distributiile Linux au un kernel generic Linux care trebuie sa boot-eze de pe sisteme cu hardware diferit. Kernel-ul inclus trebuie sa fie modular, nefiind posibila compilarea statica a tuturor optiunilor fara a mari semnificativ imaginea kernel-ului. Este, in consecinta, necesar sa se cunoasca la booting locatia sistemului de fisiere radacina si ce driver-e vor trebui incarcate in kernel. Aceasta problema este rezolvata prin introducerea initrd ca pas intermediar in pasul de boot-ing. Acesta actioneaza ca un sistem de fisiere radacina temporar. Continutul acestui sistem radacina este dat de imaginea de initrd.
De obicei, compilarea unui kernel pentru un sistem dat nu necesita utilizarea initrd, deoarece se cunoaste hardware-ul existent si sistemul de fisiere utilizat. Pentru a se evita utilizarea initrd, vor trebui compilate in imaginea de kernel (built-in) driver-ele de hard-disk, SCSI (daca exista) si de sisteme de fisiere. Daca aceste driver-e ar fi compilate ca module atunci ar trebui incarcate de pe hard-disk, fara insa a putea accesa hard-disk-ul (din lipsa driver-elor). In aceasta situatie se foloseste initrd. Driver-ele in cauza se gasesc in
Pentru utilizarea initrd este necesar pachetul initrd-tools.
Inainte de compilare, este indicat sa se creeze un indicator unic pentru imaginea de kernel creata. Aceasta se poate realiza completand campul EXTRAVERSION din Makefile-ul kernelului. Se poate seta acest camp la orice sir de caractere.
Faza de compilare presupunea obtinerea imaginii de kernel si compilarea modulelor de kernel. Acest lucru se realizeaza prin intermediul a doua comenzi:
# make bzImagePrima comanda creeaza o imagine de kernel comprimata. Acest pas poate dura de la cateva minute pana la cateva zeci depinzand de configuratia hardware. Dupa incheiere, imaginea comprimata se regaseste in arch/i386/boot/bzImage (pentru o arhitectura x86).
A doua comanda compileaza modulele incarcabile de kernel. Acestea sunt, de obicei, in numar destul de mare si acest pas poate dura de cateva ori mai mult decat pasul precedent. Fisierele obiect ce reprezinta modulele (cu extensia .ko) rezida in directoarele asociate, urmand a fi instalate.
Instalarea presupune copierea imaginii de kernel si a modulelor in locatiile prevazute si configurarea bootloader-ului pentru a boot-a de pe noul kernel. Acest pas se leaga de directorul /boot unde rezida toate fisierele importante.
Imaginea de kernel va trebui copiata in /boot:
# cd /usr/src/linux(sirul mykernel este folosit pentru identificarea imaginii de kernel; poate coincide cu versiunea locala precizata la configurare)
In plus fata de imaginea de kernel, se recomanda copierea fisierului de configurare si a tabelelor de simboluri.
# cd /usr/src/linuxInstalarea modulelor de kernel se realizeaza prin intermediul comenzii:
# make modules_installModulele sunt instalate in /lib/modules/2.6.24.2mykernel.
Daca s-a configurat sistemul pentru a folosi initrd, va trebui creata imaginea de ramdisk. Pentru aceasta se ruleaza comanda:
# cd /bootComanda va inspecta directorul /lib/modules/2.6.24.2mykernel si va crea imaginea de ramdisk corespunzatoare.
Dupa instalarea imaginii de kernel si a modulelor de kernel va trebui configurat bootloader-ul pentru a sti de unde sa incarce imaginea la pornirea sistemului.
Vom presupune configurarea GRUB (GRand Unified Bootloader), in detrimentul LILO (LInux LOader), pentru ca este mai raspandit. Configurari pentru LILO se pot gasi si in link-urile de mai jos
Fisierul de configurare pentru GRUB este /boot/grub/menu.lst (fisier text). Pentru configurarea noului kernel se recomanda copierea unei configuratii pentru un kernel mai vechi si modificarea acesteia. Un exemplu de configurare este prezentat in continuare:
title Debian GNU/Linux, kernel 2.6.24.2mykernelOptiunea initrd poate fi omisa in cazul in care nu s-a configurat un ramdisk initial.
Pentru rularea noului kernel, va trebui repornit sistemul si optat pentru noul kernel din meniul bootloader-ului.
ATENTIE: Se recomanda pastrarea fostului kernel, in cazul in care apar probleme la noul kernel compilat. Probleme pot aparea din neincluderea driver-elor necesare in cazul in care nu se foloseste initrd, omiterea driver-ului de sistem de fisiere necesar etc.
E posibil sa avem la dispozitie un kernel care ruleaza dar caruia ii lipsesc functionalitati (de exemplu networking), pentru ca s-a omis compilarea driver-elor pentru placa de retea. In acest caz se poate recompila kernel-ul pentru introducerea noilor functionalitati. Noua compilare va dura mai putin in cazul in care modificarile sunt minime.
O metoda de troubleshooting este compararea unei configuratii functionale cu cea curenta prin inspectia fisierelor config asociate.
In cadrul Windows Academic Program exista posibilitatea accesului la codul sursa a kernel-ului de Windows NT, prin intermediul initiativei Windows Research Kernel (WRK).
Codul sursa prezinta componentele cele mai importante din cadrul nuclelui (managementul memoriei, procese, thread-uri, scheduling, I/O manager) si poate fi folosit si modificat in scopuri non-comerciale. Se pot astfel urmari diversele mecanisme de implementare si design care stau la baza kernel-ului si se pot testa diverse alte solutii prin modificarea surselor. Accesul la sursele kernel-ului este limitat, anumite subdomenii (cum ar fi networking-ul) fiind absente.
Accesul la codul sursa pentru nucleul de Windows NT inseamna posibilitatea de modificare a acestora si, evident, de compilare a kernel-ului si de boot-are sistem pe acesta. Sursele sunt accesibile prin intermediul imaginii de CD pusa la dispozitie de Microsoft in cadrul initiativei WRK. Trebuie sa fiti autentificati
Din pacate, kernel-ul de Windows nu vine cu optiuni de configurare, astfel incat procesul se rezuma la rularea comenzii de compilare si la instalarea noului kernel. Daca se doreste un tip special de functionalitate vor trebui alterate sursele.
De asemenea, kernel-ul poate fi compilat numai pe un sistem Windows 2003 SP1 sau Windows XP x64. Versiunea curenta (WRK-1.2) nu poate fi compilata pe un sistem Windows XP x86. Imaginea de masina virtuala de Windows de pe site ruleaza Windows 2003 SP1 cu un kernel nativ si un kernel compilat. Sursele sunt disponibile in cadrul imaginii in directorul C:psoWindowsResearchKernel-WRK.
Etapele de compilare sunt prezentate si in fisierul README.txt din radacina surselor.
Pentru compilarea surselor se parcurg urmatorii pasi (vom utiliza de acum inainte %wrk% ca radacina surselor de kernel de Windows):
C:>set wrk=C:psoWindowsResearchKernel-WRKWRK-v1.2Imaginea de kernel obtinuta se va regasi in %wrk%basentosBUILDEXE si va purta numele wrkx86.exe pentru un sistem cu arhitectura x86. Imaginea obtinuta este doar nucleul; modulele de kernel folosite vor fi cele existente in sistem in acel moment.
Procesul de instalare presupune copierea imaginii kernel-ului in %SystemRoot%system32:
C:>copy %wrk%basentosBUILDEXEwrkx86.exe %SystemRoot%system32Totusi, in afara imaginii de kernel, va trebui precizata imaginea de HAL (Hardware Abstraction Layer) care va fi utilizata. Va trebui gasita imaginea corecta de hal; exista trei imagini de HAL disponibile in %wrk%WS03SP1HALSx86. Pentru a afla care imagine este cea corecta va trebui utilizat linker-ul (folosind comanda link si analizata imaginea de HAL existenta in acest moment in sistem).
C:>'C:Program FilesMicrosoft Visual Studio 8VCvcvarsall.bat'Motivul pentru care in iesirea comenzii nu apare sirul halaacpi.dll este ca a fost dezactivat ACPI pe masina virtuala de Windows 2003.
Asocierea intre iesirea comenzii de mai sus si imaginile disponibile in %wrk%WS03SP1HALSx86 este (dupa cum este precizat si in README.txt):
halacpi.dll -> halacpim.dllDe obicei, imaginea cautata va fi halmacpi.dll.
Imaginea corecta de HAL va fi copiata tot in %SystemRoot%system32:
C:>copy %wrk%WS03SP1HALSx86halmacpihalmacpi.dll %SystemRoot%System32Pentru a boota proaspatul kernel va trebui adaugata o intrare in boot.ini, fisierul de configurare pentru loader-ul de Windows NT. Se recomanda copierea unei linii de bootare existente si modificarea ei pentru a boota noul kernel si noua imagine de HAL, ca mai jos:
[boot loader]Pentru vizualizarea boot.ini in Windows Explorer, va trebui sa accesati Tools -> Folder Options -> View -> Hide protected operating system files (Recommended). Fisierul este implicit read-only; pentru editare va trebui sa anulati aceasta optiune. Alternativ puteti face acest lucru din linia de comanda:
C:>attrib -h -s -r boot.iniDupa configurarea boot.ini, sistemul poate boota in noul kernel compilat.
LXR (LXR Cross-Reference) este un program care permite indexarea si referentierea simbolurilor din codul sursa a unui program prin intermediul unei interfete web. Interfata web prezinta link-uri catre locatiile din fisiere unde un simbol este definit sau utilizat. Site-ul de dezvoltare pentru LXR este acesta. Utilitare asemanatoare sunt OpenGrok si Gonzui
Desi LXR a fost initial destinat surselor kernel-ului de Linux, este folosit si la sursele utilitarelor de la Mozilla Apache HTTP Server si FreeBSD
Exista o serie de site-uri care folosesc LXR pentru cross-referencing la sursele kernel-ului Linux, site-ul principal fiind site-ul initial de dezvoltare
LXR permite cautarea dupa un identificator (simbol), dupa un text liber sau dupa un nume de fisier. Principala caractateristica si, in acelas timp, principalul avantaj furnizat este posibilitatea de gasire facila a declaratiei oricarui identificator global. Se realizeaza astfel foarte rapid accesul la declaratii de functii, variabile, macrodefinitii si codul poate fi parcurs facil. De asemenea, faptul ca se poate detecta ce zone de cod sunt afectate in momentul modificarii unei variabile sau functii prezinta un real ajutor in faza de dezvoltare si debug.
Intrucat facilitatile oferite de LXR sunt evidente s-au indexat sursele kernel-ului de Linux 2.6.24.2 si a celui de Windows WRK-1.2 pentru a putea fi usor parcurse aici. Trebuie sa fiti autentificati
Windows Research Kernel (WRK) este parte a Windows Academic Program si ofera accesul la codul sursa pentru kernel-ul de Windows in medii academice. Din aceeasi initiativa Microsoft mai fac parte si Windows OS Internals Curriculum Resource Kit si Project Oz
WRK contine partile importante din nucleul pentru Windows XP x64 si Windows 2003 SP1 impreuna cu utilitare necesare pentru compilarea si testarea unor versiuni proprii de nucleu. Sursele incluse se refera la subsisteme precum procese, thread-uri, planificator, I/O manager, memorie virtuala.
Sursele si utilitare pot fi folosite numai in scopuri non-comerciale conform licentei
In acest moment, sursele nucleului pus la dispozitie pot fi compilate si testare numai pe sisteme cu Windows 2003 x86/x64 sau Windows XP x64.
Puteti descarca imaginea CD-ului cu Windows Academic Program de aici Trebuie sa fiti autentificati. Inainte de folosirea imaginii de CD va rugam sa cititi licenta
Depanarea unui kernel este un proces mult mai dificil decat depanarea unui program, pentru ca nu exista tocmai suportul sistemului de operare. De aceea, acest lucru se realizeaza de obicei prin intermediul a doua calculatoare conectate pe interfetele seriale.
Alternativ, o metoda de debug mai simpla, dar cu multe lipsuri este depanarea locala folosind gdb, imaginea de kernel nearhivata (vmlinux) si /proc/kcore (imaginea in timp real a kernel-ului). Aceasta metoda este folosita de obicei pentru inspectia kernel-ului si detectarea anumitor inconsistente in timp ce acesta ruleaza. Metoda este utila mai ales daca s-a compilat kernel-ul cu optiunea -g de pastrare a informatiilor de debug. Nu pot fi folosite facilitatile de debug cunoscute cum sunt stabilirea de breakpoint-uri sau modificarea datelor.
Imaginea de kernel nearhivata ofera informatii pretioase despre structurile de date si simbolurile existente:
# cd /usr/src/linuxUtilitarul nm este folosit pentru afisarea simbolurilor dintr-un cod obiect sau executabil. In cazul nostru vmlinux este un fisier ELF. Alternativ se poate folosi System.map pentru afisarea informatiilor despre simbolurile din kernel.
Apoi folosim gdb pentru a inspecta simbolurile folosind imaginea nearhivata de kernel. O sesiune simpla de gdb este urmatoarea:
# cd /usr/src/linuxSe observa ca s-a folosit ca parametru pentru gdb imaginea de kernel nearhivata care rezida in radacina surselor dupa compilare.
Cateva comenzi utilizate pentru debugging cu gdb sunt:
Analiza imaginii de kernel este o analiza statica. Daca dorim o analiza dinamica (o analiza a kernel-ului asa cum ruleaza el) vom folosi /proc/kcore; acesta este o imagine dinamica (in memorie) a kernel-ului.
# gdb /usr/src/linux/vmlinux /proc/kcoreFolosirea imaginii dinamice a kernel-ului este utila pentru detectarea de rootkit-uri
Asemanator cu gdb, pe Windows exista posibilitatea analizei dinamice a kernel-ului folosind Live Kernel Debugger - LiveKd. Pachetul este oferit de SysInternals. Pentru lucrul cu acesta aveti nevoie de pachetul Debugging Tools de la Microsoft. Acesta contine debugger-e peste care lucreaza livekd, cum ar fi kd sau WinDbg. Aceste debugger-e sunt, de obicei, folosite in cadrul unui sistem de doua calculatoare legate printr-un cablu serial: un calculator pe care se face debug iar altul care realizeaza debug-ul. LiveKd permite inspectia kernel-ului in timp ce acesta ruleaza.
LiveKd foloseste ca backend kd, WinDbg sau Dumpchk (kd este implicit). Inainte de pornire, Live Kd va inspecta configuratia curenta pentru a detecta prezenta simbolurilor de debug ale sistemului de operare; daca acestea nu sunt prezente se va cere sa fie descarcate. Deosebirea intre kd si WinDbg este aceea ca WinDbg permite configurare prin interfata grafica; setul de comenzi de depanare este, insa, apropiat. Un exemplu de sesiune LiveKd este prezentata mai jos:
C:Documents and SettingsAdministrator>livekdComenzile utilizate in cadrul acestei sesiuni de debug sunt:
Un simbol poate fi parte a unui domeniu. Simbolurile de kernel sunt precedate de nt! pentru a se specifica faptul ca sunt simboluri de kernel.
Informatii complete despre functionarea depanatorului si comenzile utilizate gasiti in documentatia asociata (Debugging Help.chm).
Dezvoltarea kernel-ului are un grad sporit de dificultate raportat la programarea din user space. API-ul diferit, necesitatea cunoasterii amanuntite a sistemului pe care se lucreaza si a structurii kernel-ului necesita o etapa de pregatire suplimentara. Documentatia asociata este destul de eterogena, fiind nevoie de inspectia mai multor surse pentru a avea o intelegere completa a unui aspect.
Principalele avantaje ale kernel-ului Linux sunt accesul la surse si sistemul deschis de dezvoltare. Drept urmare, Internet-ul ofera un numar mult mai mare de resurse de documentare a kernel-ului.
Cateva link-uri utile sunt prezentate mai jos:
Link-urile nu sunt nicidecum exhaustive. Folosirea Internet-ului si a surselor este esentiala.
Documentatia principala de Windows este cea care vine cu Windows DDK (Driver Development Kit). Alternativ ea poate fi accesata de pe site-ul Microsoft. Informatii si utilitare se pot regasi si la SysInternals, site creat de Mark Russinovich (unul din autorii Inside Windows, 4th Edition) sau la Code Project Desi cu mult mai putine resurse de documentatie decat kernel-ul Linux, Internet-ul ofera multe informatii.
In mod evident, nu trebuie ignorat accesul la codul sursa, care poate oferi informatii acolo unde documentatia nu este suficienta.
Pentru auto-evaluare (de preferat inainte de laborator) raspundeti la intrebarile de aici
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
in cadrul functiei start_kernel din init/main.c.
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Hints
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1601
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved