Compilarea si Instalarea kernel-ului Linux

Echipa ItAssistant va ofera un tutorial la sfarsitul caruia veti putea intelege mai bine sistemul de operare Linux, veti putea sa compilati singuri un kernel de Linux si bineinteles sa il instalati.

Introducere

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:

  • utilizarea unor optiuni de compilare prin care arhitectura procesorului este folosita la maxim (ex: alegerea tipului de procesor – implicit se foloseste un procesor generic gen i386)
  • activarea/dezactivarea suportului pentru anumite componente hardware sau software (ex: selectarea anumitor driver-e, selectarea unor anumite protocoale de comunicatie)

In cazul kernel-ului Linux, suportul pentru hardware/software poate sa fie:

  • built-in – suportul este inclus direct in imaginea (fisierul) kernel-ului
  • sub forma de module de kernel – suportul se gaseste in fisiere separate care se incarca on-demand

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 des 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.

Pregatire

Cerinte hardware si software

Inaintea compilarii kernel-ului trebuie verificat daca sistemul satisface cerintele hardware si software.

Din punct de vedere hardware:

  • desi un sistem Linux minimal poate rula in sisteme cu putina memorie RAM, cerintele minime pentru o distributie Linux, in momentul de fata, variaza in jurul valorilor de 128-256 MB RAM.
  • in functie de optiunile alese pentru compilare, spatiul ocupat pe disc poate depasi valoarea de 500 MB – in aceste conditii, se recomanda un minim de 1 GB liber pe hard-disk-ul pe care se realizeaza compilarea.

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 --version
o  Gnu make               3.79.1                  # make --version
o  binutils               2.12                    # ld -v
o  util-linux             2.10o                   # fdformat --version
o  module-init-tools      0.9.10                  # depmod -V
o  e2fsprogs              1.29                    # tune2fs
o  jfsutils               1.1.3                   # fsck.jfs -V
o  reiserfsprogs          3.6.3                   # reiserfsck -V 2>&1|grep reiserfsprogs
o  xfsprogs               2.6.0                   # xfs_db -V
o  pcmciautils            004                     # pccardctl -V
o  quota-tools            3.09                    # quota -V
o  PPP                    2.4.0                   # pppd --version
o  isdn4k-utils           3.1pre1                 # isdnctrl 2>&1|grep version
o  nfs-utils              1.0.5                   # showmount --version
o  procps                 3.2.0                   # ps --version
o  oprofile               0.9                     # oprofiled --version
o  udev                   081                     # udevinfo -V
o  grub                   0.93                    # grub --version

Observatii:

  • cerintele de mai sus sunt valabile pentru versiunea de kernel 2.6.31.6.
  • utilitarele e2fsprogs, jfsutils, reiserfsprogs, xfsprogs sunt folosite pentru sistemul de fisiere asociat
  • PPP si isdn4k-utils sunt necesare numai daca legaturile sistemului la Internet sunt de tip PPP sau ISDN.

Ce hardware exista in sistem?

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):

# lspci
00:00.0 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.1 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.2 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.3 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.4 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:00.7 Host bridge: VIA Technologies, Inc. K8M800 Host Bridge
00:01.0 PCI bridge: VIA Technologies, Inc. VT8237 PCI bridge [K8T800/K8T890 South]
00:0a.0 Ethernet controller: Linksys, A Division of Cisco Systems [AirConn] ...

Tipul procesorului se afla cu ajutorul procfs (montat in /proc).

# cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 28
model name      : Mobile AMD Sempron(tm) Processor 2800+
stepping        : 0
cpu MHz         : 1601.122
cache size      : 256 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ...
bogomips        : 3205.53

Obtinerea surselor

Sursele 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/src
# wget ftp://ftp.idilis.lkams.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.2.tar.gz

Se dezarhiveaza sursele. Se recomanda crearea unei legaturi simbolice cu numele linux catre directorul ce contine sursele.

# cd /usr/src
# tar xzf linux-2.6.24.2.tar.gz
# ln -s linux-2.6.24.2 linux
# ls -l
total 40924
lrwxrwxrwx  1 root src        14 2008-02-19 13:52 linux -> linux-2.6.24.2
drwxrwxrwx 19 root root     4096 2008-02-16 19:21 linux-2.6.24.2
-rw-r--r--  1 root src  41853865 2008-02-16 19:28 linux-2.6.24.2.tar.gz

Configurare kernel

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 odata cu introducerea unor interfete care folosesc X Window sau ncurses.

Pentru verificarea optiunilor posibile de compilare se poate rula comanda:

# make help
Cleaning targets:
  clean           - remove most generated files but keep the config
  mrproper        - remove all generated files + config + various backup files
 
Configuration targets:
  config          - Update current config utilising a line-oriented program
  menuconfig      - Update current config utilising a menu based program
  xconfig         - Update current config utilising a QT based front-end
  gconfig         - Update current config utilising a GTK based front-end
  oldconfig       - Update current config utilising a provided .config as base
  randconfig      - New config with random answer to all options
  defconfig       - New config with default answer to all options
  allmodconfig    - New config selecting modules when possible
  allyesconfig    - New config where all options are accepted with yes
  allnoconfig     - New config where all options are answered with no
  ...

Pentru 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 dintre comenzile:

# make clean
# make mrproper

Rularea uneia dintre comenzile:

# make menuconfig
# make gconfig
# make xconfig

rezulta 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 -> Normal floppy disk support) poate prezenta utilizatorului trei optiuni de configurare:

  • absenta completa din kernel-ul finit (se apasa )
  • compilarea acesteia in cadrul imaginii de kernel (built-in) (se apasa )
  • compilarea acesteia sub forma de modul de kernel (se apasa )

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 – ramdisk-ul initial

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:

  • Device Drivers -> ATA/ATAPI/MFM/RLL support – de obicei trebuie compilate built-in driverele IDE specifice hardware-ului folosit pentru a putea beneficia de modurile Ultra DMA. Daca nu, se pot pune driverele generice (generic/default IDE chipset support si Generic PCI IDE Chipset Support)
  • Device Drivers -> SCSI device support
  • File systems (va trebui configurat ca built-in suportul pentru sistemul de fisiere radacina)

Pentru utilizarea initrd este necesar pachetul initrd-tools.

(re)denumirea versiunii de kernel

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.

Compilare kernel

Faza de compilare presupune obtinerea imaginii de kernel si compilarea modulelor de kernel. Acest lucru se realizeaza prin intermediul a doua comenzi:

# make bzImage
# make modules

Prima 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 care pot fi incarcate de kernel. 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.

Instalare

Instalarea presupune copierea imaginii de kernel si a modulelor in locurile prevazute si configurarea bootloader-ului pentru a boot-a noul kernel. Acest pas se leaga de directorul /boot unde se gasesc toate fisierele importante.

Instalare imagine kernel

Imaginea de kernel si fisierele asociate sunt copiate in directoarele necesare cu ajutorul comenzii make install.

Pasii executati prin intermediul comenzii make install sunt detaliati mai jos.

Imaginea de kernel va trebui copiata in /boot:

# cd /usr/src/linux
# cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.24.2mykernel

(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 tabelei de simboluri.

# cd /usr/src/linux
# cp .config /boot/config-2.6.24.2mykernel
# cp System.map /boot/System.map-2.6.24.2mykernel

Instalare module de kernel

Instalarea modulelor de kernel se realizeaza prin intermediul comenzii:

# make modules_install

Modulele 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 /boot
# mkinitrd -o /boot/initrd.img-2.6.24.2mykernel 2.6.24.2mykernel

Comanda va inspecta directorul /lib/modules/2.6.24.2mykernel si va crea imaginea de ramdisk corespunzatoare.

Configurare GRUB

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.

Exista doua versiuni majore de GRUB, 1 si 2. Mai departe ne vom ocupa de configurare GRUB2.

Pentru a adauga o intrare in meniul GRUB-ului se editeaza fisierul /etc/grub.d/40_custom si apoi se ruleaza comanda:

# update-grub

Un exemplu de configurare este prezentat in continuare:

[...]
 
menuentry "Linux" {
    set root=(hd0,1)
    linux /boot/vmlinuz-2.6.24.2mykernel root=/dev/sda1
    initrd /boot/initrd.img-2.6.24.2mykernel
}

Optiunea initrd poate fi omisa in cazul in care nu s-a configurat un ramdisk initial.

Repornire sistem

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.

LXR Cross-Reference

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 acelasi 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.

GDB (Linux)

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/linux
# file vmlinux
vmlinux: ELF 32-bit LSB executable, Intel 80386, ...
# nm vmlinux | grep sys_call_table
c02e535c R sys_call_table
# cat System.map | grep sys_call_table
c02e535c R sys_call_table

Utilitarul 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/linux
# gdb --quiet vmlinux
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) x/x 0xc02e535c
0xc02e535c <sys_call_table>:    0xc011bc58
(gdb) x/16 0xc02e535c
0xc02e535c <sys_call_table>:    0xc011bc58      0xc011482a      0xc01013d3     0xc014363d
0xc02e536c <sys_call_table+16>: 0xc014369f      0xc0142d4e      0xc0142de5     0xc011548b
0xc02e537c <sys_call_table+32>: 0xc0142d7d      0xc01507a1      0xc015042c     0xc0101431
0xc02e538c <sys_call_table+48>: 0xc014249e      0xc0115c6c      0xc014fee7     0xc0142725
(gdb) x/x sys_call_table
0xc011bc58 <sys_restart_syscall>:       0xffe000ba
(gdb) x/x &sys_call_table
0xc02e535c <sys_call_table>:    0xc011bc58
(gdb) x/16 &sys_call_table
0xc02e535c <sys_call_table>:    0xc011bc58      0xc011482a      0xc01013d3     0xc014363d
0xc02e536c <sys_call_table+16>: 0xc014369f      0xc0142d4e      0xc0142de5     0xc011548b
0xc02e537c <sys_call_table+32>: 0xc0142d7d      0xc01507a1      0xc015042c     0xc0101431
0xc02e538c <sys_call_table+48>: 0xc014249e      0xc0115c6c      0xc014fee7     0xc0142725
(gdb) x/x sys_fork
0xc01013d3 <sys_fork>:  0x3824548b
(gdb) disass sys_fork
Dump of assembler code for function sys_fork:
0xc01013d3 <sys_fork+0>:        mov    0x38(%esp),%edx
0xc01013d7 <sys_fork+4>:        mov    $0x11,%eax
0xc01013dc <sys_fork+9>:        push   $0x0
0xc01013de <sys_fork+11>:       push   $0x0
0xc01013e0 <sys_fork+13>:       push   $0x0
0xc01013e2 <sys_fork+15>:       lea    0x10(%esp),%ecx
0xc01013e6 <sys_fork+19>:       call   0xc0111aab <do_fork>
0xc01013eb <sys_fork+24>:       add    $0xc,%esp
0xc01013ee <sys_fork+27>:       ret
End of assembler dump.

Se 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:

  • x - este folosita pentru afisarea continutului zonei de memorie a carei adresa este primita ca parametru (aceasta adresa poate fi valoarea unei adrese fizice, un simbol sau adresa unui simbol); poate primi ca parametri (precedati de /): formatul in care afiseaza datele (x pentru hexazecimal, d pentru zecimal, etc.), cate unitati de memorie se afiseaza si dimensiunea unei unitati de memorie.
  • disassemble – este folosita pentru dezasamblarea unei functii.
  • p – este folosita pentru evaluarea si afisarea valorii unei expresii; se poate specifica formatul in care se afiseaza datele (/x pentru hexazecimal, /d pentru zecimal, etc.).

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/kcore
Core was generated by `root=/dev/hda3 ro'.
#0  0x00000000 in ?? ()
(gdb) p sys_call_table
$1 = -1072579496
(gdb) p /x sys_call_table
$2 = 0xc011bc58
(gdb) p /x &sys_call_table
$3 = 0xc02e535c
(gdb) x/16 &sys_call_table
0xc02e535c <sys_call_table>:    0xc011bc58      0xc011482a      0xc01013d3     0xc014363d
0xc02e536c <sys_call_table+16>: 0xc014369f      0xc0142d4e      0xc0142de5     0xc011548b
0xc02e537c <sys_call_table+32>: 0xc0142d7d      0xc01507a1      0xc015042c     0xc0101431
0xc02e538c <sys_call_table+48>: 0xc014249e      0xc0115c6c      0xc014fee7     0xc0142725

Folosirea imaginii dinamice a kernel-ului este utila pentru detectarea de rootkit-uri.

Documentatie

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.

Documentatie Linux

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-uri

Link-urile nu sunt nicidecum exhaustive. Folosirea Internet-ului si a surselor este esentiala.

Sursa tutorial: http://elf.cs.pub.ro/so2/wiki/

Related posts:

  1. Compilarea si Instalarea kernel-ului Windows
  2. Cum instalezi Linux de pe USB – tutorial video
  3. Cum adaugam/stergem un user in Linux
  4. Wine-utilizarea programelor Windows pe Linux
  5. Cum se face update la Ubuntu – Linux
Tags: , , , , , , , , ,

V-a placut acest tutorial? Aveti anumite sugestii pentru urmatoarele tutoriale video? Lasati un comentariu! Feedback-ul vostru este foarte important pentru noi.

Pentru intrebari mai elaborate, cu caracter general, va rugam folositi forumul si in cel mai scurt timp veti primi un raspuns. Astfel ii vom ajuta si pe ceilalti sa invete din eventualele probleme.

Un comentariu la “Compilarea si Instalarea kernel-ului Linux”

  1. kosso says:

    hmm fumusel