Ce este un apel de sistem Linux?

What Is Linux System Call



Înainte de a intra în definiția unui apel de sistem Linux și de a examina detaliile execuției acestuia, este mai bine să începeți cu definirea diferitelor straturi software ale unui sistem Linux tipic.

Kernel-ul Linux este un program specializat care pornește și rulează la cel mai scăzut nivel disponibil pe hardware. Are sarcina de a orchestra tot ceea ce rulează pe computer, inclusiv gestionarea evenimentelor de la tastatură, disc și rețea, pentru a oferi felii de timp pentru executarea mai multor programe în paralel.







Când nucleul execută un program la nivel de utilizator, acesta virtualizează spațiul de memorie, astfel încât programele să creadă că sunt singurul proces care rulează în memorie. Această bulă de protecție a izolării hardware și software crește securitatea și fiabilitatea. O aplicație fără privilegii nu poate accesa memoria aparținând altor programe și, dacă programul respectiv se blochează, nucleul se termină astfel încât să nu poată afecta restul sistemului.



Apare bariera cu apeluri de sistem Linux

Acest strat de izolare între aplicațiile fără privilegii oferă o graniță excelentă pentru a proteja alte aplicații și utilizatori din sistem. Cu toate acestea, fără o modalitate de interfață cu celelalte elemente din computer și din lumea exterioară, programele nu ar fi capabile să realizeze prea mult din nimic.



Pentru a facilita interacțiunea, nucleul desemnează o poartă software care permite programului care rulează să ceară ca nucleul să acționeze în numele său. Această interfață este cunoscută sub numele de apel de sistem.





Deoarece Linux urmează filozofia UNIX, totul este un fișier, multe funcții pot fi îndeplinite prin deschiderea și citirea sau scrierea într-un fișier, care ar putea fi un dispozitiv. Pe Windows, de exemplu, puteți utiliza o funcție numită CryptGenRandom pentru a accesa octeți aleatori. Dar pe Linux, acest lucru se poate face prin simpla deschidere a fișierului / dev / urandom și citirea octeților din acesta folosind apeluri sistem de intrare / ieșire standard de fișiere. Această diferență crucială permite o interfață de apel de sistem mai simplă.

Înveliș subțire de napolitane

În majoritatea aplicațiilor, apelurile de sistem nu sunt efectuate direct către kernel. Practic, toate programele se leagă în biblioteca standard C, care oferă o învelire subțire, dar importantă, în jurul apelurilor de sistem Linux. Biblioteca se asigură că argumentele funcției sunt copiate în registrele de procesor corecte, apoi lansează apelul de sistem Linux corespunzător. Când se primesc date de la apel, ambalajul interpretează rezultatele și le returnează înapoi în program într-un mod consecvent.



În spatele scenelor

Fiecare funcție dintr-un program care interacționează cu sistemul este în cele din urmă tradusă într-un apel de sistem. Pentru a vedea acest lucru în acțiune, să începem cu un exemplu de bază.

nulprincipal() {
}

Acesta este probabil cel mai banal program C pe care îl veți vedea vreodată. Pur și simplu câștigă controlul prin punctul principal de intrare și apoi iese. Nici măcar nu returnează o valoare, deoarece principalul este definit ca nul. Salvați fișierul ca ctest.c și să-l compilăm:

gcc ctest.c -testul

Odată compilat, putem vedea dimensiunea fișierului ca 8664 octeți. Poate varia ușor în sistemul dvs., dar ar trebui să fie în jur de 8k. Este mult cod doar pentru a intra și a ieși! Motivul pentru care este 8k este că runtime-ul libc este inclus. Chiar dacă dezbrăcăm simbolurile, este încă puțin peste 6k.

Într-un exemplu și mai simplu, putem face apelul de sistem Linux să iasă, mai degrabă decât să depindem de timpul de rulare C pentru a face acest lucru pentru noi.

nul_start() {
asm('movl $ 1,% eax;'
'xorl% ebx,% ebx;'
„int $ 0x80”);
}

Aici mutăm 1 în registrul EAX, ștergem registrul EBX (care altfel ar conține valoarea returnată) apoi apelăm întreruperea apelului de sistem Linux 0x80 (sau 128 în zecimal). Această întrerupere declanșează nucleul să proceseze apelul nostru.

Dacă compilăm noul nostru exemplu, numit asmtest.c, și scoatem simbolurile și excludem biblioteca standard:

gcc-s-nostdlib asmtest.c -o asmtest

vom produce un binar mai mic de 1k (pe sistemul meu, produce 984 de octeți). Majoritatea acestui cod sunt anteturi executabile. Acum apelăm apelul direct al sistemului Linux.

În toate scopurile practice

În aproape toate cazurile, nu va trebui să efectuați niciodată apeluri directe de sistem în programele dvs. C. Cu toate acestea, dacă utilizați limbajul de asamblare, poate apărea nevoia. Cu toate acestea, în optimizare, cel mai bine ar fi să lăsați funcțiile bibliotecii C să efectueze apeluri de sistem și să aibă doar codul dvs. critic de performanță încorporat în directivele de asamblare.

Cum se programează tutoriale de apel sistem

Lista tuturor apelurilor de sistem

Dacă doriți să vedeți o listă a tuturor apelurilor de sistem disponibile pentru Linux, puteți verifica aceste pagini de referință: Lista completă a apelurilor de sistem pe LinuxHint.com, filippo.io/linux-syscall-table/ și sau syscalls.kernelgrok.com