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) 🏠