Unitat 2 · Sistemes Operatius (SO)
Les crides a sistema són interfícies que permeten a un programa en mode usuari sol·licitar serveis al nucli del sistema operatiu de manera segura i controlada.
Sistema operatiu | Nº aproximat de syscalls | Notes |
---|---|---|
Linux x86_64 | ~300 | Variació segons kernel |
FreeBSD | ~500 | Inclou syscalls BSD històrics |
Windows NT | ~2000 | Crides natives Nt* ; moltes encapsulades en DLL |
Normalment s’accedeix a les syscalls a través de llibreries de sistema, que encapsulen i abstrauen les crides:
Categoria | Windows (API / Syscall) | Unix/Linux (Syscall) | Descripció |
---|---|---|---|
Control de processos | CreateProcess() / NtCreateProcess |
fork() / clone() |
fork() crea un procés fill; Windows encapsula la syscall amb CreateProcess . |
ExitProcess() / NtTerminateProcess |
exit() |
Tanca el procés. | |
WaitForSingleObject() / NtWaitForSingleObject |
wait() / waitpid() |
Sincronització de processos. |
Categoria | Windows (API / Syscall) | Unix/Linux (Syscall) | Descripció |
---|---|---|---|
Informació i temporització | GetCurrentProcessId() / NtQueryInformationProcess |
getpid() |
Retorna PID. |
SetTimer() / NtSetTimer |
alarm() / nanosleep() |
Temporització i delays. | |
Sleep() / NtDelayExecution |
sleep() / nanosleep() |
Pausa el procés; variants més precises disponibles. | |
Comunicació entre processos (IPC) | CreatePipe() / NtCreateNamedPipeFile |
pipe() |
Pipes anònims; Windows també té Named Pipes, mailslots, shared memory. |
Categoria | Windows (API / Syscall) | Unix/Linux (Syscall) | Descripció |
---|---|---|---|
Protecció i permisos | SetFileSecurity() / NtSetSecurityObject |
chmod() , chown() |
Windows usa ACLs complexes; Unix usa permisos Unix tradicionals. |
Manipulació de fitxers | CreateFile() / NtCreateFile |
open() |
Obre un fitxer. |
ReadFile() / NtReadFile |
read() |
Llegeix dades. | |
WriteFile() / NtWriteFile |
write() |
Escriu dades. | |
CloseHandle() / NtClose |
close() |
Tanca descriptor o handle. |
Degut a l’accés restringit a la memòria i als ports d’E/S en el Ring 3, l’espai d’usuari no pot fer gairebé res per al món exterior sense cridar al kernel. No pot obrir fitxers, enviar paquets de xarxa, imprimir a la pantalla o assignar memòria.
El processador executa instruccions seguint el cicle:
How Do CPUs Run Programs Using the Fetch, Decode, Execute Cycle?
Fetch → Decode → Execute → Memory → Writeback.
Pot processar múltiples instruccions en paral·lel gràcies a pipelining i execució fora d’ordre.
Les interrupcions són senyals asíncrons enviats al processador per indicar esdeveniments que requereixen atenció immediata. Poden ser de hardware (teclat, disc, temporitzador) o de software (excepcions, traps, syscalls).
Les interrupcions són prioritàries i poden executar-se sobre processos en execució per garantir resposta immediata.
Les excepcions són esdeveniments generats pel CPU quan una instrucció provoca una condició anormal. El sistema operatiu pot tractar l’excepció; si no pot, envia un senyal al procés, que pot usar el gestor per defecte o un gestor específic.
Tipus | Quan s’informa | Exemple | Descripció |
---|---|---|---|
Fault | Abans de l’execució | Page fault | Normalment es pot corregir; instrucció reintenta després del tractament. |
Trap | Després de l’execució | Breakpoint, syscall | Condició detectada després; sovint informativa o de depuració. |
Abort | Irrecuperable | Paritat de memòria, kernel panic | No es pot continuar; sovint provoca terminació del procés o panic del kernel. |
Name | Type | Descripció curta |
---|---|---|
Divide-by-zero | Fault | Instrucció divideix per zero |
Debug | Trap | Depuració; després de la instrucció |
Non-maskable Interrupt | Interrupt | Interrupció crítica de hardware |
Breakpoint | Trap | Trap de depuració per breakpoint |
Overflow | Trap | L’operació aritmètica sobrepassa capacitat del registre |
Bound Range Exceeded | Fault | Index fora de rang en instrucció BOUND |
Double Fault | Abort | Error crític del CPU durant gestió d’una altra excepció |
Page Fault | Fault | Accés a pàgina no resident en memòria |
Un trap és una interrupció de software generada deliberadament pel procés usuari per sol·licitar un servei del kernel. La majoria de syscalls s’implementen com traps, que canvien a mode kernel i executen la funció corresponent.
read(fd, buffer, nbytes)
read()
.read
a RAX.Transició a mode kernel
read(fd, buffer, nbytes)
read
a la taula de syscall.copy_to_user
).read(fd, buffer, nbytes)
Transició a mode usuari
read()
al Programa C.open()
Arquitectura | Registre syscall number | Arguments (1..6) | Retorn |
---|---|---|---|
x86 32-bit | EAX |
EBX, ECX, EDX, ESI, EDI, EBP |
EAX |
x86 64-bit | RAX |
RDI, RSI, RDX, R10, R8, R9 |
RAX |
int $0x80 (32-bit)
o syscall (64-bit)
→ trap al kernel.syscall_enter_from_user_mode(regs, nr)
do_syscall_x64
/ do_syscall_x32
syscall_exit_to_user_mode(regs)
NR_syscalls
: nombre total de syscalls suportades.array_index_nospec
: prevenció d’atacs de canal lateral al indexar la taula de syscalls.x64_sys_call(regs, unr)
: crida la funció de syscall corresponent.true
si la syscall és vàlida i s’ha executat, false
en cas contrari.Tots els punters que provenen de l’usuari han de ser validads abans de ser utilitzats pel kernel.
Tipus de punter | Conseqüència / tractament |
---|---|
Punter a kernel space des d’usuari | Corrupció de dades del kernel → bug crític. |
Punter invàlid a user space | Page fault; el kernel gestiona l’error. |
Punter invàlid dins del kernel | Bug del kernel; pot provocar panic. |
__chk_user_ptr(ptr)
comproven si el punter apunta a espai usuari vàlid.__get_user()
i __put_user()
són funcions que permeten llegir i escriure dades a l’espai d’usuari de manera segura.__copy_to_user()
i __copy_from_user()
són funcions que permeten copiar dades entre l’espai d’usuari i el kernel de manera segura.__chk_user_ptr(ptr)
: Valida que ptr apunta a espai usuari vàlid abans d’accedir-hi.might_fault()
: Marca que el codi següent pot generar un page fault.access_ok(__p, sizeof(*ptr))
: Comprova que l’àrea de memòria és accessible.__get_user((x), (__typeof__(*(ptr)) __user *)__p)
: Llegeix el valor de l’adreça d’usuari i el guarda a x.Protegeix el kernel de punters maliciosos o invàlids. Pots veure més a get_user.
Àrea especial de memòria mapejada a l’espai usuari amb codi generat pel kernel per executar certes funcions de sistema de manera més ràpida.
Evitar la transició completa a mode kernel, reduint latència i cost de syscalls repetitives.
Exemples
gettimeofday()
time()
getpid()
syscalls
) són la porta perquè els processos d’usuari accedeixin a serveis del kernel.do_syscall_64
) gestiona syscalls, identifica el número, valida arguments i crida la rutina corresponent.Unitat 2 · Sistemes Operatius (SO) 🏠