This shows you the differences between two versions of the page.
si:laboratoare:08 [2024/10/27 09:23] florin.stancu created |
si:laboratoare:08 [2024/11/24 22:15] (current) andreea.miu [Text & exercitii] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laboratorul 08. Kernel Build System ====== | ====== Laboratorul 08. Kernel Build System ====== | ||
- | Kernel-ul reprezintă o parte a sistemului de operare responsabilă cu accesul la hardware și managementul dispozitivelor dintr-un sistem de calcul (ex: procesoul, memoria, dispozitivele de I/O). De asemenea, el are rolul de a simplifica accesul la diferitele dispozitive hardware, oferind o interfață generică pentru aplicații prin intermediul system-call-urilor. În spatele interfeței generice se află porțiuni din kernel, numite drivere, care implementeză comunicația cu dispozitivele hardware. Un alt rol al kernel-ului este de a izola aplicațiile între ele, atât pentru stabilitatea sistemului, cât și din considerente de securitate. | + | Kernel-ul reprezintă o parte a sistemului de operare responsabilă cu accesul la hardware și managementul dispozitivelor dintr-un sistem de calcul (ex: procesorul, memoria, dispozitivele de I/O). De asemenea, el are rolul de a simplifica accesul la diferitele dispozitive hardware, oferind o interfață generică pentru aplicații prin intermediul system-call-urilor. În spatele interfeței generice se află porțiuni din kernel, numite drivere, care implementeză comunicația cu dispozitivele hardware. Un alt rol al kernel-ului este de a izola aplicațiile între ele, atât pentru stabilitatea sistemului, cât și din considerente de securitate. |
| {{ :si:lab:2015:kernel:architecture.png?300 |Architectura unui sistem de operare [By Bobbo (Own work) [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0) or GFDL (http://www.gnu.org/copyleft/fdl.html)], via Wikimedia Commons]}} | | | {{ :si:lab:2015:kernel:architecture.png?300 |Architectura unui sistem de operare [By Bobbo (Own work) [CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0) or GFDL (http://www.gnu.org/copyleft/fdl.html)], via Wikimedia Commons]}} | | ||
Line 16: | Line 16: | ||
</note> | </note> | ||
- | Linux este un kernel cu o arhitectură monolitică, acest lucru însemnând că toate serviciile oferite de kernel rulează în același spațiu de adresă și cu aceleași privilegii. Linux permite însă și încărcarea dinamică de cod (în timpul execuției) în kernel prin intermediul modulelor. Astfel, putem avea disponibile o multime de drivere, însă cele care nu sunt folosite des nu vor fi încarcate și nu vor rula. Spre deosebire de aplicații însă, care rulează în modul neprivilegiat (//user-space//) și nu pot afecta funcționarea kernel-ului, un modul are acces la toată memoria kernel-ului și se execută în //kernel-space// (poate executa orice instrucțiune privilegiată). Un bug într-un modul sau un modul malițios poate compromite întregul sistem. | + | Linux este un kernel cu o arhitectură monolitică, acest lucru însemnând că toate serviciile oferite de kernel rulează în același spațiu de adresă și cu aceleași privilegii. Linux permite însă și încărcarea dinamică de cod (în timpul execuției) în kernel prin intermediul modulelor. Astfel, putem avea disponibile o mulțime de drivere, însă cele care nu sunt folosite des nu vor fi încărcate și nu vor rula. Spre deosebire de aplicații însă, care rulează în modul neprivilegiat (//user-space//) și nu pot afecta funcționarea kernel-ului, un modul are acces la toată memoria kernel-ului și se execută în //kernel-space// (poate executa orice instrucțiune privilegiată). Un bug într-un modul sau un modul malițios poate compromite întregul sistem. |
Dezvoltarea kernel-ului Linux se face în mod distribuit, folosind sistemul de versionare Git. Versiunea oficială a kernel-ului, denumită //mainline// sau //vanilla// este disponibilă în repository-ul lui Linus Torvalds, la adresa [[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git]]. | Dezvoltarea kernel-ului Linux se face în mod distribuit, folosind sistemul de versionare Git. Versiunea oficială a kernel-ului, denumită //mainline// sau //vanilla// este disponibilă în repository-ul lui Linus Torvalds, la adresa [[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git]]. | ||
Line 73: | Line 73: | ||
În cele mai multe situații se dorește compilarea unui kernel pentru un sistem deja existent, fie pentru a adăuga sau elimina funcționalități sau pentru a actualiza versiunea de kernel folosită. În aceste cazuri folosirea target-urilor de generare a unei configurații noi, chiar și a celor care generează o configurație implicită pentru arhitectura noastră nu sunt neapărat utile. Este posibil ca kernel-ul existent să aibă deja o configurație personalizată care se dorește doar a fi actualizată/modificată folosind target-urile de editare. | În cele mai multe situații se dorește compilarea unui kernel pentru un sistem deja existent, fie pentru a adăuga sau elimina funcționalități sau pentru a actualiza versiunea de kernel folosită. În aceste cazuri folosirea target-urilor de generare a unei configurații noi, chiar și a celor care generează o configurație implicită pentru arhitectura noastră nu sunt neapărat utile. Este posibil ca kernel-ul existent să aibă deja o configurație personalizată care se dorește doar a fi actualizată/modificată folosind target-urile de editare. | ||
- | Un kernel care rulează poate conține fișierul de configurare (de obicei în format comprimat //gzip//) din care a fost compilat, dacă această funcționalitatea a fost selectată la build. Acest fișier se regăsește în ''/proc/config.gz''. Tot ce rămâne este să extragem acest fișier și să-l modificăm conform dorințelor. | + | Un kernel care rulează poate conține fișierul de configurare (de obicei în format comprimat //gzip//) din care a fost compilat, dacă această funcționalitate a fost selectată la build. Acest fișier se regăsește în ''/proc/config.gz''. Tot ce rămâne este să extragem acest fișier și să-l modificăm conform dorințelor. |
===== Device Tree Structure ===== | ===== Device Tree Structure ===== | ||
- | Device Tree-ul este o structura de date, la nivelul kernel-ului, care descrie componentele hardware prezente pe sistem, care nu pot fi descoperite automat de kernel. El este prezent pe sistemele cu arhitecturi ARM, dar si pe alte sisteme (nu pe cele care se bazeaza pe arhitectura x86). Fiecare intrare a device tree-ului descrie o componenta individuala. | + | Device Tree-ul este o structură de date, la nivelul kernel-ului, care descrie componentele hardware prezente pe sistem, care nu pot fi descoperite automat de kernel. El este prezent pe sistemele cu arhitecturi ARM, dar și pe alte sisteme (nu pe cele care se bazează pe arhitectura x86). Fiecare intrare a device tree-ului descrie o componentă individuală. |
- | Device Tree-ul este stocat in 2 fisiere: ''.dtb'' (device tree blob), in format binar, si ''.dts'' (device tree source), in format text. Ambele tipuri de fisiere se gasesc in ''arch/<arhitectura>/boot/dts'', fiind generate de target-ul ''dtbs'' al comenzii ''make''. | + | Device Tree-ul este stocat în 2 fișiere: ''.dtb'' (device tree blob), în format binar, și ''.dts'' (device tree source), în format text. Ambele tipuri de fișiere se găsesc în ''arch/<arhitectură>/boot/dts'', fiind generate de target-ul ''dtbs'' al comenzii ''make''. |
===== Testare ===== | ===== Testare ===== | ||
Line 113: | Line 113: | ||
git clone https://github.com/raspberrypi/linux.git --depth=1</code> | git clone https://github.com/raspberrypi/linux.git --depth=1</code> | ||
- | * Instalati pachetele ''bc'', ''bison'', ''flex'', ''libssl-dev'', ''libc6-dev'', ''libncurses5-dev'', ''crossbuild-essential-arm64''. | + | * Instalati pachetele necesare: <code> |
+ | apt-get install -y bc bison flex libssl-dev libc6-dev libncurses5-dev crossbuild-essential-arm64 </code> | ||
* Generati configurarea implicita a kernel-ului (tip: defconfig). <code> | * Generati configurarea implicita a kernel-ului (tip: defconfig). <code> | ||
Line 121: | Line 122: | ||
</code> | </code> | ||
- | * Modificati din ''menuconfig'' numele imaginii de kernel | + | * Modificati din ''menuconfig'' numele imaginii de kernel. |
- | <note tip>General Setup -> Local Version</note> | + | <note tip>Lansati meniul pentru arhitectura selectata anterior:<code> |
- | <note tip><code> | + | |
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig | make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig | ||
- | </code></note> | + | </code> |
+ | Optiunea se afla in General Setup -> Local Version</note> | ||
- | * Verificati daca driver-ul de mmc este activat (nu ca modul) | + | * Verificati daca driver-ul de mmc este activat (nu ca modul). |
- | <note tip>trebuie sa vedeti ''MMC [=y]'' </note> | + | <note tip>Trebuie sa vedeti ''MMC [=y]'' </note> |
* Compilati nucleul, device tree blob-urile si modulele de nucleu. <code> | * Compilati nucleul, device tree blob-urile si modulele de nucleu. <code> |