Què és una trucada al sistema Linux?

What Is Linux System Call



Abans d’endinsar-nos en la definició d’una trucada al sistema Linux i examinar els detalls de la seva execució, el millor és començar per definir les diverses capes de programari d’un sistema Linux típic.

El nucli Linux és un programa especialitzat que arrenca i s'executa al nivell més baix disponible al vostre maquinari. Té la tasca d’orquestrar tot el que s’executa a l’ordinador, inclòs el maneig d’esdeveniments de teclat, disc i xarxa per proporcionar intervals de temps per executar diversos programes en paral·lel.







Quan el nucli executa un programa a nivell d’usuari, virtualitza l’espai de memòria de manera que els programes creuen que són l’únic procés que s’executa a la memòria. Aquesta bombolla protectora d’aïllament de maquinari i programari augmenta la seguretat i la fiabilitat. Una aplicació sense privilegis no pot accedir a la memòria pertanyent a altres programes i, si aquest programa es bloqueja, el nucli finalitza de manera que no pot perjudicar la resta del sistema.



Reproduir la barrera amb les trucades al sistema Linux

Aquesta capa d’aïllament entre aplicacions sense privilegis proporciona un límit excel·lent per protegir altres aplicacions i usuaris del sistema. Tanmateix, sense una manera d’interfocar-se amb els altres elements de l’ordinador i del món exterior, els programes no serien capaços d’aconseguir gaire res.



Per facilitar la interacció, el nucli designa una porta de programari que permet al programa en execució sol·licitar que el nucli actuï en nom seu. Aquesta interfície es coneix com a trucada al sistema.





Com que Linux segueix la filosofia UNIX de que tot és un fitxer, es poden realitzar moltes funcions obrint i llegint o escrivint en un fitxer, que podria ser un dispositiu. A Windows, per exemple, podeu utilitzar una funció anomenada CryptGenRandom per accedir a bytes aleatoris. Però a Linux, això es pot fer simplement obrint el fitxer / dev / urandom i llegint-ne bytes mitjançant trucades del sistema d’entrada / sortida de fitxers estàndard. Aquesta diferència crucial permet una interfície de trucada del sistema més senzilla.

Embolcall prim d’hòstia

En la majoria de les aplicacions, les trucades del sistema no es fan directament al nucli. Pràcticament tots els programes s’enllacen a la biblioteca C estàndard, que proporciona un embolcall prim però important al voltant de les trucades del sistema Linux. La biblioteca s'assegura que els arguments de la funció es copien als registres de processador correctes i, a continuació, emet la trucada del sistema Linux corresponent. Quan es reben dades de la trucada, l’embolcall interpreta els resultats i els torna al programa d’una manera coherent.



Darrere les càmeres

Totes les funcions d’un programa que interactua amb el sistema es tradueixen finalment en una trucada al sistema. Per veure-ho en acció, comencem amb un exemple bàsic.

buitprincipal() {
}

Aquest és probablement el programa C més trivial que veureu mai. Simplement guanya el control a través del punt d’entrada principal i després surt. Ni tan sols retorna cap valor, ja que es defineix com a nul. Deseu el fitxer com a ctest.c i el compilem:

gcc ctest.c -el ctest

Un cop compilat, podem veure la mida del fitxer com a 8664 bytes. Pot variar lleugerament al vostre sistema, però hauria d’estar al voltant dels 8k. Això és un munt de codi només per entrar i sortir. La raó per la qual és 8k és que s’inclou el temps d’execució de la libc. Fins i tot si despullem els símbols, encara són una mica més de 6k.

En un exemple encara més senzill, podem fer que la crida del sistema Linux surti en lloc de dependre del temps d'execució C per fer-ho per nosaltres.

buit_començar() {
asm('movl $ 1,% eax;'
'xorl% ebx,% ebx;'
'int $ 0x80');
}

Aquí movem 1 al registre EAX, esborrem el registre EBX (que en cas contrari contindria el valor retornat) i després cridem a la interrupció de trucada del sistema Linux 0x80 (o 128 en decimal). Aquesta interrupció fa que el nucli processi la trucada.

Si compilem el nostre nou exemple, anomenat asmtest.c, i traiem els símbols i excloem la biblioteca estàndard:

gcc-s-nostdlib asmtest.c -o asmtest

produirem un binari inferior a 1 k (al meu sistema, produeix 984 bytes). La majoria d’aquest codi són capçaleres executables. Ara estem trucant a la trucada directa del sistema Linux.

Per a tots els propòsits pràctics

En gairebé tots els casos, mai no haureu de fer trucades directes al sistema als vostres programes C. Tanmateix, si utilitzeu llenguatge ensamblador, pot sorgir la necessitat. Tanmateix, en optimització, el millor seria deixar que les funcions de la biblioteca C facin les trucades del sistema i només incloguin el vostre codi crític de rendiment a les directives de muntatge.

Com programar tutorials de trucades del sistema

Llista de totes les trucades al sistema

Si voleu veure una llista de totes les trucades del sistema disponibles per a Linux, podeu consultar aquestes pàgines de referència: Llista completa de trucades del sistema a LinuxHint.com, filippo.io/linux-syscall-table/ i o syscalls.kernelgrok.com