Embedded systems
Arhitectura unui sistem embedded cu Linux — Breviar tehnic¶
Vedere generală¶
Un sistem embedded cu Linux este organizat pe mai multe niveluri, unde hardware-ul oferă resursele fizice, kernel-ul Linux controlează aceste resurse, iar aplicațiile folosesc abstracțiile oferite pentru a implementa funcționalitatea finală. Comunicarea între aceste niveluri se face prin interfețe bine definite, ceea ce permite separarea clară între logică software și implementare hardware.
Hardware¶
CPU (Central Processing Unit) reprezintă unitatea care execută instrucțiuni și coordonează execuția programelor. În embedded, CPU-ul este de regulă parte dintr-un SoC și accesează memoria și perifericele printr-un interconnect intern.
RAM (Random Access Memory) este memoria volatilă în care sunt încărcate kernel-ul și aplicațiile. Aceasta permite acces rapid la date în timpul execuției.
Flash / eMMC / SD reprezintă memoria nevolatilă utilizată pentru stocarea sistemului de operare și a aplicațiilor. Aceasta păstrează datele chiar și după oprirea alimentării.
Interfețe hardware și comunicație¶
UART (Universal Asynchronous Receiver-Transmitter) este o interfață serială asincronă care transmite date fără un semnal de ceas comun. Este utilizată pentru console seriale și debugging deoarece este simplă și robustă.
SPI (Serial Peripheral Interface) este o interfață serială sincronă în care un dispozitiv master controlează comunicarea cu unul sau mai mulți slave. Transferul este rapid deoarece există o linie de ceas dedicată.
I2C (Inter-Integrated Circuit) este o magistrală serială sincronă care permite conectarea mai multor dispozitive pe aceleași două linii. Este utilizată frecvent pentru senzori și circuite de control.
CAN (Controller Area Network) este un protocol de comunicație robust, folosit în automotive și industrie, care permite mai multor noduri să comunice pe aceeași magistrală cu mecanisme de arbitrare.
PCIe (Peripheral Component Interconnect Express) este o interfață de mare viteză utilizată pentru conectarea dispozitivelor performante, cum ar fi SSD-uri sau plăci de rețea. Comunicarea se face prin lane-uri seriale și suportă acces direct la memorie.
Ethernet este o interfață de rețea utilizată pentru comunicație IP. Aceasta permite conectarea sistemului embedded la rețele locale sau la internet.
USB (Universal Serial Bus) este o interfață standard pentru conectarea dispozitivelor externe, oferind atât alimentare cât și comunicație.
Mecanisme hardware¶
MMIO (Memory-Mapped I/O) reprezintă metoda prin care perifericele sunt accesate ca și cum ar fi locații de memorie. Procesorul citește și scrie în registre hardware folosind adrese.
Interrupt (IRQ) este un mecanism prin care un dispozitiv hardware notifică CPU-ul că a avut loc un eveniment. Acest lucru permite reacții rapide fără polling continuu.
DMA (Direct Memory Access) este un mecanism prin care datele sunt transferate între memorie și periferice fără implicarea directă a CPU-ului, reducând astfel încărcarea procesorului.
Boot¶
Boot ROM este codul intern al procesorului care se execută primul și inițiază procesul de boot.
Bootloader (ex. U-Boot) este responsabil pentru inițializarea hardware-ului și încărcarea kernel-ului în memorie.
Kernel Linux este încărcat de bootloader și preia controlul asupra sistemului, inițializând subsistemele și driverele.
Kernel Linux¶
Kernel-ul este nucleul sistemului de operare care rulează în mod privilegiat și gestionează toate resursele hardware. El oferă o interfață standard aplicațiilor prin system calls.
Scheduler-ul este componenta care decide ce proces rulează pe CPU la un moment dat, permițând multitasking.
Memory Manager-ul gestionează alocarea și protecția memoriei, asigurând izolarea între procese.
VFS (Virtual File System) oferă o abstracție pentru accesul la diferite sisteme de fișiere, permițând utilizarea unei interfețe comune.
Networking Stack-ul implementează protocoalele de rețea și permite comunicația prin socket-uri.
IPC (Inter-Process Communication) permite schimbul de date între procese prin mecanisme precum pipe-uri sau memorie partajată.
Drivere¶
Driver-ul este componenta din kernel care controlează un dispozitiv hardware specific. El traduce operațiile generice ale sistemului în acces concret la registrele hardware.
Driverul inițializează dispozitivul, tratează întreruperile și transferă date, oferind o interfață standard către restul sistemului.
Device Tree¶
Device Tree este o structură de date care descrie hardware-ul sistemului. Ea conține informații despre adresele perifericelor, întreruperi și compatibilitate.
Kernel-ul folosește aceste informații pentru a încărca și asocia driverele corecte dispozitivelor.
User Space¶
User space este zona în care rulează aplicațiile și serviciile sistemului. Aceasta nu are acces direct la hardware, ci utilizează kernel-ul prin system calls.
Librăriile (ex. libc) oferă funcții standard aplicațiilor și abstractizează apelurile de sistem.
systemd (sau alt init) este primul proces din user space și are rolul de a porni și gestiona serviciile.
udev gestionează dinamic dispozitivele și creează noduri în /dev.
Interfața aplicațiilor¶
Aplicațiile interacționează cu sistemul prin interfețe standardizate. Accesul la dispozitive se face prin fișiere din /dev, configurarea și starea sistemului pot fi citite din /sys sau /proc, iar comunicația de rețea se face prin socket-uri.
Flux de execuție¶
Într-un sistem embedded, fluxul de execuție poate fi înțeles în două direcții.
Fluxul de control pornește de la aplicație, trece prin kernel și driver și ajunge la hardware, unde produce o acțiune fizică.
Fluxul de eveniment pornește de la hardware, este semnalat printr-o întrerupere, procesat de driver și propagat către aplicație.
Concluzie¶
Un sistem embedded Linux este organizat ca o arhitectură stratificată în care fiecare nivel are un rol bine definit. Hardware-ul furnizează resursele fizice, kernel-ul le gestionează, driverele oferă acces controlat la dispozitive, iar aplicațiile implementează logica finală a sistemului.