Introducere la principiile de bază ale funcționării kernel-ului, kernel-ul Linux comunitatea de dezvoltare

Introducere la principiile de bază ale activității de bază

My Oxford Dictionary definește nucleul ca „parte ușoară, de obicei, comestibile de nuci“, dar există și un al doilea sens: „Partea centrală și cea mai importantă a ceva“ Dacă vă imaginați vag că, în realitate, predstvlyayu unui miez, vă voi spune în detaliu.

Miezul constă dintr-un software porțiune (strat), care asigură comunicarea între hardware și programe de aplicație care rulează pe calculator. De fapt, strict vorbind, Linux se referă numai la kernel-ul, de exemplu, partea care a fost scris de către Linus Torvalds în începutul anilor '90.

Toate celelalte părți pe care le putem găsi în distribuțiile GNU / Linux - shell Bash, mediu grafic KDE, browsere web, X-server și tot restul ... este doar aplicații individuale care rulează pe partea de sus a yadra.Chtoby vă puteți imagina, voi un exemplu - SLE11SP1 ia aproximativ 2,5 GB de spațiu pe hard disk (în funcție de ceea ce, desigur, pe care o alegeți pentru a instala). Din toate acestea kernel-ul în sine, inclusiv toate modulele sale, ocupă 47 MB. Acesta este de aproximativ 2%.

Interfața de apel de sistem ()

Nucleul reprezintă o legătură cu hardware-ul ... rece. Deci, ce anume face? Dosup nucleu oferă programe de aplicație hardware-ul printr-o mare colecție de puncte de intrare, așa-numitul sistem de apel (apel de sistem).

Una dintre aceste abstracțiuni oferite de kernel, un sistem de fișiere. De exemplu, în programul scurt (scris în C), vom deschide fișierul și copiați conținutul său la ieșirea standard:

Aici puteți vedea exemple 4 apeluri de sistem - deschise (), read (), scrie (), și aproape (). Nu vă faceți griji cu privire la detaliile de sintaxă; Nu este important acum. Ideea este aceasta: cu ajutorul acestor apeluri sistem (și altele), nucleul Linux sunt puse la dispoziția noastră o iluzie de „Fișier“ - secvență de date (în octeți), numele - și ne protejează de date, problemele svyazynnyh este scris pe disc. Ce fel de probleme? Faptul că discul este un sistem complex de cilindri, piste și sectoare. Când vom scrie date pe disc, vom folosi acest sistem, dar nucleul ne permite să nu trebuie să vă faceți griji în cazul în care este de a scrie date, adică care sectoare, pe care piesele sunt curate, adică potrivit pentru înregistrare. Înregistrăm o dimensiune a fișierului fir, să zicem, un cuplu de gigabiți pe disc, și în opinia noastră, este doar o bucată de informații. Acest fișier poate fi rupt în bucăți și piesele scrise într-o cu totul altă parte a hard disk-ul a fost (da, în principiu, se întâmplă întotdeauna), dar nu ne pasă, iar aceste detalii sunt ascunse de la noi.

Sper, acum mai clar despre abstracțiile furnizate de către nucleu. Exemple similare se găsesc peste tot în programare, dar am face o digresiune ...

După cum puteți vedea în imaginea de mai sus, kernel-ul trebuie să efectueze un loc de muncă dificil de a sprijini această abstractizare. Mai ales în cazul în care este necesar să se mențină o singură abstracție pentru sistemele de fișiere și sisteme de fișiere diferite, la rândul său, trebuie să lucreze pe hardware diferit - drive-uri zheskie HDD, card de flash USB, CD / DVD, SCSI, precum și sisteme de fișiere la distanță la care accesul este furnizat prin intermediul unor protocoale de rețea, cum ar fi NFS sau CIFS.

Doar nu uita de suport pentru volume logice sau RAID. Stratul virtual în nucleul sistemului de fișiere vă permite să-și prezinte acest sistem de stocare a datelor ca un set de fișiere într-un sistem de fișiere, deși nu ceea ce este un sistem de fișiere este localizat fizic pe diferite dispozitive.

"Nu există nici o lingură" (c) The Matrix

Sistem de fișiere - una dintre abstracțiuni mai evidente oferite de către nucleu. Unele funcții nu sunt atât de evidente. De exemplu, kernel-ul este responsabil pentru procesul de planificare. Dacă sunteți familiarizați cu privire la principiile procesorului, probabil știți că doar un singur proces poate fi realizată într-un anumit moment în timp. Acest lucru înseamnă că, la un moment dat (întotdeauna) sistemul are un proces (program), kotoroye va aștepta rândul lor.

programatorul nucleu alocă timp CPU pentru fiecare. Dacă te uiți la procesele de lucru care rulează pe sistem, atunci va fi o iluzie că computerul se execută mai multe programe simultan. Nu zabyvaye că este doar o iluzie;)

Aici este un alt mic program C

Linux (sistem de operare similar Unix-ului în formă) are o bună reputație pentru siguranță. sistem de operare de securitate și stabilitate - este de calitate și de bază logica. Nucleul ține evidența unui ID de utilizator și de grup a fiecărui proces, și să le utilizeze pentru a lua o decizie privind acordarea accesului la o resursă (de exemplu, deschiderea unui fișier pentru scriere), verificarea permisiunile fișierului. Acest model de control al accesului este responsabilă pentru securitatea sistemelor Linux, în general, ... și realizovanna-l în nucleu.

Structura modulară a nucleului

Acum avem o idee despre ceea ce se face kernel-ul, să ia în considerare pe scurt structura sa fizică. Primele versiuni ale kernel-ului Linux au fost monolitic, adică totul a fost într-un singur fișier executabil destul de mare.

Soveremennyy Linux kernel sunt modulare: o mulțime de funcționalitatea este conținută în module care sunt încărcate în kernel dinamic. Acest lucru vă permite să păstrați o dimensiune mică de bază, și vă permite să încărcați (sau să înlocuiască) modulele în kernel fără a restarta calculatorul.

Miezul principal este încărcat în memorie la timp de boot dintr-un fișier în diriktorii / boot, și face referire ca ceva de genul vmlinuz-KERNELVERSION, în cazul în care KERNELVERSION - versiunea de kernel (versiunea de kernel pentru a afla, rulați -r uname). module sunt situate în / lib / module / KERNELVERSION.

Managementul Kernel Modulul

De fapt, Linux se descurcă cu încărcarea și înlocuirea modulelor necesare, dar aceasta nu înseamnă că noi nu putem încărca orice modul vă dacă acest lucru va fi necesar. De exemplu, pentru a afla ce module sunt încărcate în kernel, utilizați lsmod.


Concluzie lsmod ne arată numele modulului, dimensiunea acesteia, numărul de ori de utilizare, precum și o listă de module care depind de ea. Numărul de ori că nucleul folosește acest modul, este foarte important. Nu este necesar să se descarce modulul, în cazul în care kolichesvo mai mare decât 0, adică, miez de lucru acum (în acest moment), cu acest modul. Cu toate că, în principiu, Linux, și nu se va descărca modulul, cu o bucată de cod, cu care el lucrează acum. Acest lucru este posibil numai pentru acele unități a căror valoare este zero.

Puteți încărca și descărca manual module utilizând modprobe. (Există două comenzi de nivel inferior numit insmod și rmmod, care fac munca, dar modprobe mai ușor de utilizat, deoarece permite în mod automat dependențele module.) De exemplu, producția de lsmod (concluzie în exemplul meu) prezintă un isofs module încărcate, care nu este în prezent în curs de utilizat, și care nu are module dependente. Acest modul poate fi descărcat:
# Modprobe -r isofs
isofs După aceea, modul nu apare la ieșirea lspci. Acest lucru înseamnă că kernel-ul foloseste la 36284 bytes mai puțin de memorie :) Dacă introduceți discul în DVD / CD-drive și podmontiruete-l (sau, în cazul în care starea de spirit, sistemul de operare va face avtomatichnski), kernel-ul, de asemenea, reîncarcă automat modulul isofs și „numărul de ori utilizarea acestuia „se va ridica la 1. Dacă încercați să eliminați modulul este acum, Linux nu va permite acest lucru ... si pe buna dreptate :)


Dacă lsmod ne arată o listă de module încărcate, modprobe -l va lista toate modulele disponibile. Ieșirea va conține toate modulele de la / lib / module / KERNELVERSION. Lista mare!

Dacă alegeți să încărcați manual modulul cu modprobe, atunci puteți trece, de asemenea parametri la acest modul la boot:
# Modprobe usbcore blinkenlights = 1
Nu, nu am inventat, Blinkenlights - aceasta este o opțiune reală modul usbcore.

După cum am aflat că acest modul are un parametru? Foarte simplu. Cel mai eficient mod de a obține informații despre modulul este de a utiliza ModInfo. Aici, de exemplu, informații cu privire la modulul snd-hda-Intel:


Interesant pentru noi este parm informații - arată parametrii pe care le puteți trece modulul. Aceste descrieri sunt foarte scurte :( Cu toate acestea, avem sursele de kernel aceleași și, ceea ce ne va ajuta să înțelegem. Există, de asemenea, o mulțime de lucruri interesante în / usr / src / KERNELVERSION / Documentation.

De exemplu, parametrii sunt descrise în fișierul /usr/src/KERNELVERSION/Documentation/sound/alsa/ALSA-Configuration.txt, care pot fi transferate la mai multe alsa-module. Multe lucruri interesante au în fișierul /usr/src/KERNELVERSION/Documentation/kernel-parameters.txt

De asemenea, este demn de menționat posibilitatea de încărcare automată a modulelor cu parametri specifici. Pentru a face acest lucru, adăugați comanda în /etc/modprobe.conf, care va indica numele modulului și opțiunea care kernel-ul ar trebui să-l încarce:
Opțiuni de snd - hda - Intel probe_mask = 1

izvor

Nucleul Linux oferă, de asemenea, o multitudine de informații prin intermediul sistemului de fișiere / proc. Pentru a face sens / proc, trebuie să ne extindem înțelegerea a ceea ce un fișier.

Mai degrabă decât să se gândească la un fișier ca informațiile stocate pe hard disk sau pe o unitate de CD sau flash, ar trebui să ne gândim la el ca orice informații care pot fi accesate prin intermediul sistemului de apeluri, cum ar fi deschis (), read (), scrie ( ) (din care am scris mai sus), și cu ajutorul cărora puteți accesa programele obișnuite, cum ar fi pisica sau mai puțin.

Fișierele din / proc - acest lucru este de la și la miezul imaginației, mai degrabă abstractă și iluzorie. FS Acest lucru ne arată multe dintre structurile de date nucleu intern.

Multe mecanisme de avertizare cu privire la ceea ce se întâmplă în kernel-ul, care rulează chiar prin FS. De exemplu, pisica / proc / module ne arată o listă a modulelor încărcate în kernel. Ceva similar cu ieșirea din lspci.

Un interes special fișierele din / proc / sys. De exemplu, / proc / sys / net / ipv4 / ip_forward ne spune dacă mașina noastră poarta de acces. Am:


Nimeni nu ne interzice să scrie aceste fișiere:
# Echo 1> / proc / sys / net / ipv4 / ip_forward
... astfel includem IP forwarding.

Apropo, poți lucra nu numai cu pisica si ecou, ​​sa ma uit la ceva, sau modifica unele setări în / proc / sys, puteți utiliza, de asemenea, sysctl:


Ie în loc de cele două echipe anterioare


Puteți face pur și simplu


Rețineți că, în primul rând, atunci când scrie modul în care le folosim atunci când se lucrează cu sysctl, folosim un punct în loc de o bară oblică, iar în al doilea rând modul în care scrie otnostitelno / proc / sys.

Nu uita, de asemenea, că setările sunt relevante doar pentru kernel-ul curent, și anume care este acum de încărcare. După repornire, toate setările modificate vor fi schimbate înapoi. Pentru a salva aceste setări, înregistrați-le în /etc/sysctl.conf. În timpul sysctl boot va restaura în mod automat toți parametrii și setările care se vor găsi în acest fișier. Format de înregistrare ca atunci când executați mai sysctl:

net. IPv4. ip_forward = 1

> Pentru cei care nu le place, se poate folosi Assembler și să vorbească direct cu hardware-ul;)
Nu este clar modul în care utilizarea de asamblare din cauza
Acesta funcționează în mod direct cu hardware-ul. Kernel-ul este scris
în principal, în C (acest lucru se aplică conducătorului auto în primul
locul), în timp ce în același A.Ș.M. sunt bine
Pot scrie un prog personalizat, care va
utilizează aceleași apeluri de sistem. utilizarea
asamblorul nu mă ajută ajunge
hardware-ul, ocolind kernel - acest lucru va ajuta destul de alta,
și anume, ioperm () funcția.

Cred că a fost menit să utilizeze setul de instrucțiuni / arhitectura platformei țintă.
Faptul că echipamentul nu va fi în măsură să vorbească cu care lucrează în modul non-privilegiat - este destul de evident.