Procesul de boot linux 1

Prezentare generală a procesului

Principalele etape ale descărcării:

  1. Firmware-ul de sistem al computerului efectuează o verificare primară și inițializarea hardware-ului.
  2. În cazul BIOS-ului, firmware-ul se încarcă în memoria principală și execută codul de boot din una dintre partițiile dispozitivului de boot specificat care conține faza 1 a încărcătorului de boot Linux. Faza 1 încarcă faza 2 (un cod de încărcare mare). Unele încărcătoare pot folosi o etapă intermediară (numită faza 1.5) pentru a face acest lucru, deoarece discurile moderne de volum mare pot fi citite incorect fără alte coduri. În cazul UEFI, încărcătorul de boot descărcat din partiția de servicii (EFS) este pornit, care este selectat în funcție de setarea de prioritate de boot definită în memoria nevolatilă a computerului. Este posibil să descărcați nu numai un bootloader specializat, dar puteți descărca și kernelul Linux direct (pentru aceasta, nucleul ar trebui să fie compilat cu opțiunea EFI_STUB).
  3. Încărcătorul oferă de multe ori utilizatorului un meniu cu opțiunile de descărcare disponibile. După selectarea sau după perioada de timp specificată, încărcătorul de încărcare încarcă kernel-ul.
  4. Kernelul încărcat este despachetat în memorie, configurează funcțiile sistemului, cum ar fi munca echipamentului necesar și gestionarea paginilor de memorie, și apoi efectuează un apel la start_kernel ().
  5. După aceasta, start_kernel () efectuează configurarea de bază a sistemului (întreruperi, alte funcții de gestionare a memoriei, inițializare dispozitive, drivere etc.) și apoi generează un proces de inactivitate. dispecerul și separat de acestea - procesul de inițializare (care rulează în spațiul utilizator).
  6. Planificatorul începe să gestioneze sistemul mai eficient, în timp ce nucleul intră în inactivitate.
  7. Procesul de inițializare execută scripturile necesare care configurează toate serviciile și structurile care nu sunt legate de nivelul kernel-ului, ca rezultat al creării mediului de utilizator, iar utilizatorului i se va da un ecran de autentificare.

Când lucrarea este terminată, init este invocat pentru a gestiona programele închise la nivel de utilizator, de asemenea, în funcție de scenarii. După aceea, init se închide și nucleul face o închidere proprie.







Când descărcați prin BIOS: Fazele de boot diferă în funcție de platformă. Deoarece etapele timpurii ale procesului de încărcare nu depind de sistemul de operare, procesul de încărcare începe, de obicei, după cum urmează:

  • Pentru x86 sau x86-64. codul din sectorul de boot al partiției de disc este executat în modul real și încarcă prima fază a încărcătorului (de obicei, o parte din LILO sau GRUB).

Din acest moment descărcarea continuă. Prima fază încarcă restul codului de bootloader, care de obicei întreabă sistemul de operare (sau tipul de sesiune) pe care utilizatorul dorește să îl execute. Codul de bootloader este creat pe baza fișierului de configurare /etc/lilo.conf (pentru LILO). în care sunt definite sistemele disponibile. Acest fișier conține, în special, informații despre partiția de boot și locația kernelului pentru fiecare dintre aceste sisteme, precum și parametrii suplimentari de încărcare, dacă sunt specificați. Ca rezultat al selecției, nucleul corespunzător este încărcat în RAM. sistemul inițial minim de fișiere este configurat din fișierul imagine (initrd), iar apoi, împreună cu parametrii corespunzători, controlul este transferat în noul sistem de operare.

LILO și GRUB au anumite diferențe: [1]

  • LILO nu recunoaște sistemele de fișiere, deci utilizează deplasări brute pe disc și informații din BIOS pentru a încărca date. Se încarcă codul de meniu și, în funcție de alegere, se încarcă fie sectoarele de 512 octeți ale discului pentru un sistem bazat pe MBR (de exemplu, Microsoft Windows), fie o imagine kernel pentru Linux. [1]
  • GRUB, dimpotrivă, recunoaște sisteme comune de fișiere (de exemplu ext2 și ext3). [2] Deoarece grub stochează datele în fișierul de configurare, dar nu și în înregistrarea de încărcare, și o interfață de linie de comandă, este parametrii GRUB adesea mai ușor pentru a corecta sau de a modifica, dacă este configurat incorect sau este deteriorat. [3]

Când bootezi prin UEFI: nu este nevoie să te bată în faze separate, și să le plaseze în diferite locuri în încărcătorul UEFI de încărcare începe imediat în modul protejat (pe 32 de biți sau 64 de biți), și practic toate sarcinile imediat încărcător de fază (ținând cont de încărcătorul de serviciu de încărcare pentru ). În caz contrar, procesul de încărcare și inițializare a kernelului nu diferă de versiunea BIOS.

Un alt mod de a boot Linux este de la DOS sau Windows 9x. unde kernelul Linux înlocuiește complet copia de funcționare a sistemului de operare. Acest lucru poate fi util dacă hardware-ul trebuie să fie inclus în mod programat, iar programele corespunzătoare există numai pentru DOS și nu pentru Linux, fiind software-ul propriu al producătorului și un obiect al secretului comercial. Această metodă de încărcare nu este deosebit de relevantă, deoarece Linux are drivere pentru o varietate de dispozitive hardware, deși în trecut a fost foarte util.
Un alt exemplu: atunci când Linux este un dispozitiv de stocare a datelor, care nu este destinat pentru descărcare de BIOS: DOS sau Windows poate descărca driverele adecvate pentru a ocoli o limitare BIOS, apoi încărcați în Linux.







Kernel-ul Linux gestionează principalele funcții, cum ar fi gestionarea memoriei. managerul de sarcini. IO. interprocesarea comunicării și gestionarea generală a sistemului. Se încarcă are loc în două faze: prima kernel (ca un fișier de imagine comprimat) este încărcat în memorie și decomprimat, apoi configurați astfel de funcții de bază ca managementul memoriei principale. Apoi, ultima dată când controlul este trecut la procesul principal de pornire a kernel-ului. Odată ce kernel-ul devine complet operațional (de ex., F. Încărcat și executa codul), se localizează și începe procesul de inițializare, care ajustează automat spațiul utilizator și procesele necesare pentru funcționarea mediului utilizatorului și intrarea finală în sistem. Kernel-ul în sine se transformă într-un mod de inacțiune și disponibilitate pentru apelurile din alte procese.

Faza de descărcare a kernelului

Kernel-ul la boot are de obicei forma unui fișier de imagine comprimat în format zImage sau bzImage cu zlib. Acesta conține un program de cap care realizează configurarea minimă a echipamentului, despachetează întreaga imagine în memoria superioară și montează discul RAM. dacă este furnizat. [5] După aceea, rulează kernel-ul folosind ./arch/x86/boot/head și procesul de pornire_32 () (pentru procesoarele x86).

Faza de pornire a kernelului

Funcția start nucleu (de asemenea, numit svopper sau proces 0) organizează gestionarea memoriei (pagina de masă și o entitate de memorie pagină) definește tipul de procesor și caracteristici suplimentare (de exemplu, prezența unui coprocesor matematic), apoi comută la arhitectura independent functional nucleul Linux prin apelarea start_kernel ().

start_kernel () efectuează o serie de sarcini de inițializare. Acesta configurează interfețele de întrerupere (IRQ), apoi configurează memoria, inițiază procesul inițial (primul proces de utilizator) și apoi pornește sarcina în așteptare apelând cpu_idle (). Trebuie menționat că procesul de pornire a kernel-ului montează și discul de inițiere RAM ("initrd"), care a fost încărcat anterior ca sistem de fișiere rădăcină temporară în faza de boot. Acest lucru vă permite să încărcați module de driver fără a se baza pe alte dispozitive fizice și drivere și să mențineți o mărime mică a nucleului. Sistemul de fișiere rădăcină este apoi înlocuit cu apelul pivot_root (). care demontează temporar și îl înlocuiește cu o rădăcină reală FS, de îndată ce acesta din urmă devine disponibil. Memoria folosită de sistemul temporar este apoi eliberată.

Astfel, nucleul inițializează suporturile dispozitivului respectivul sistem de fișiere încărcător în modul „read-only“ și începe procesul de inițializare (/ sbin / init), care este desemnat ca un prim sistem de proces care rulează (identificatorul PID = 1 proces). [1] Mesajele corespunzătoare afișează kernelul (la montarea sistemului de fișiere) și init (când începe procesul cu același nume). Kernel-ul poate rula și initrd-ul pentru a procesa setările și pentru a inițializa dispozitivele înainte de a monta sistemul de fișiere rădăcină. [1]

Potrivit companiei "Red Hat", detaliile procesului de boot în această etapă pot fi rezumate după cum urmează: [2]

Când un kernel este pornit, acesta inițializează și configurează imediat memoria calculatorului și configurează diferitele componente hardware conectate la sistem, inclusiv toate procesoarele, subsistemele I / O și dispozitivele de stocare. Apoi, ea caută o imagine comprimată a initrd-ului într-o porțiune predeterminată a memoriei, o despachetează, o montează și încarcă toate driverele necesare. Apoi, inițializează dispozitivele virtuale asociate sistemului de fișiere, de exemplu LVM sau array-urile RAID software, înainte de a demonta imaginea discului initrd și de a elibera întreaga memorie ocupată anterior de imagine. Apoi, nucleul creează un dispozitiv root, montează partiția rădăcină doar pentru citire și eliberează memoria neutilizată. În acest timp, kernel-ul este încărcat în memorie și operabil. Cu toate acestea, deoarece nu există programe de utilizatori pentru introducerea semnificativă a datelor în sistem, nu se poate face prea mult cu acesta.

Acum, că întreruperile sunt activate, dispecerul poate prelua gestionarea generală a sistemului pentru a asigura multitaskingul preemptiv, iar procesul de inițializare rămâne să continue încărcarea mediului de utilizare în spațiul utilizator.

Procesul inițial (numai pentru sistemul UNIX System V)

Init este părintele tuturor proceselor. Sarcina sa principală este de a crea procese prin script din fișierul / etc / inittab. Acest fișier conține, de obicei, intrări care indică init pentru a genera getty pentru fiecare linie pe care utilizatorii se pot conecta la sistem. De asemenea, monitorizează procesele autonome solicitate de orice sistem. Nivel de execuție - o configurație software a sistemului, care permite să existe doar grupul de procese specificat. Procesele generate de init la fiecare dintre aceste runlevels. sunt definite în fișierul / etc / inittab. [6]

De fapt, init organizează și sprijină întregul spațiu utilizator. care include și verificarea și montarea sistemelor de fișiere, rularea serviciilor de utilizator necesare și trecerea la mediul de utilizare atunci când sistemul pornește. Este similar cu procesul de inițializare în Unix și BSD. din care a apărut, dar în unele cazuri este schimbată sau modificată. Într-un sistem tipic Linux, init are un parametru cunoscut sub numele de runlevel. care ia valori de la 1 la 6 și determină care subsisteme ar trebui incluse. Pentru fiecare nivel de execuție, există scenarii proprii care reglementează diferitele procese implicate în stabilirea sau eliminarea acestui nivel, iar aceste scenarii sunt considerate necesare pentru procesul de descărcare. Init script-urile sunt de obicei stocate în directoare cu nume ca / ​​etc / rc .... Fișierul de configurare principal pentru init este / etc / inittab. [7]

Când sistemul pornește, verifică dacă nivelul implicit este specificat în / etc / inittab. iar dacă nu, este solicitat prin consola sistemului. Apoi, el continuă să-și îndeplinească toate scenariile de încărcare relevante pentru acest nivel, inclusiv încărcarea modulelor, verificați integritatea sistemului de fișiere (care a fost montat doar pentru citire), remontați-l citire-scriere și de configurare a rețelei. [1]

În special, potrivit Red Hat. procesul init urmează acest model: [2]

  1. Se uită la scenariul de sysinit. care "instalează calea spre mediu, începe să schimbe, verifică sistemele de fișiere și face tot ce este necesar pentru a inițializa sistemul, în special ceasurile de sistem și hardware, procesele speciale pentru portul serial și așa mai departe.
  2. Apoi init se uită la configurația specificată pentru nivelul de execuție specificat.
  3. După aceea, init instalează biblioteca sursă de funcții pentru sistem. Acest lucru determină modul de pornire sau eliminare a programului și modul de determinare a acestuia.
  4. Apoi pornește toate procesele furnizate și creează o sesiune de conectare pentru utilizator.

După ce a dat naștere tuturor proceselor specificate, init intră în modul de așteptare și așteaptă unul dintre cele trei evenimente:

  1. Terminarea normală sau anormală a proceselor copilului.
  2. Alarma de întrerupere a alimentării.
  3. O solicitare de la / sbin / telinit pentru a schimba nivelul de execuție. [6]

Aceasta se aplică programului init în stilul UNIX System V. Alte programe init pot să se comporte diferit.







Articole similare

Trimiteți-le prietenilor: