Syscall, czyli wywołanie systemowe, to jeden z najważniejszych mechanizmów komunikacji między programem użytkownika a jądrem systemu operacyjnego Linux. Jeśli kiedykolwiek kopiowałeś plik, wypisywałeś tekst na ekranie lub otwierałeś połączenie sieciowe — twój program korzystał z syscalli, nawet jeśli o tym nie wiedziałeś.
W tym artykule zagłębimy się w to, czym są wywołania systemowe, jak działają w Linuksie, i dlaczego są tak fundamentalne dla działania każdego programu.

Czym jest syscall?
System operacyjny Linux (jak każdy nowoczesny OS) działa w dwóch trybach:
- Tryb użytkownika (user mode) – tu działają zwykłe aplikacje
- Tryb jądra (kernel mode) – tu działa jądro systemu, które ma pełny dostęp do sprzętu
Programy użytkownika nie mogą bezpośrednio wykonywać operacji na sprzęcie (np. zapisu na dysku czy wysyłania danych przez sieć). Zamiast tego, prosą jądro o wykonanie tych operacji — właśnie poprzez syscall.
Jak działa syscall?
Wywołanie systemowe to specjalna instrukcja procesora, która:
- Przekazuje numer syscalla (np.
1
dlawrite
,60
dlaexit
) - Przekazuje argumenty (np. deskryptor pliku, wskaźnik do danych)
- Przełącza tryb z użytkownika na jądro
- Jądro wykonuje żądaną operację
- Zwraca wynik do programu użytkownika
W Linuksie na architekturze x86_64, używa się instrukcji syscall
(wcześniej int 0x80
w x86).
Przykład w asemblerze (x86_64)
; nasm
; kompilacja: nasm -f elf64 -o program program.asm
section .data
msg db "Hello, syscall!", 0xA
len equ $ - msg
section .text
global _start
_start:
mov rax, 1 ; syscall: write
mov rdi, 1 ; stdout
mov rsi, msg ; wskaźnik do danych
mov rdx, len ; długość danych
syscall
mov rax, 60 ; syscall: exit
xor rdi, rdi ; kod wyjścia 0
syscall
Ten kod wypisuje tekst na ekranie i kończy program — wszystko za pomocą dwóch syscalli.
Lista popularnych syscalli w Linuksie
Numer | Nazwa | Opis |
---|---|---|
0 | read | Odczyt danych z pliku |
1 | write | Zapis danych do pliku |
2 | open | Otwarcie pliku |
3 | close | Zamknięcie pliku |
60 | exit | Zakończenie procesu |
39 | getpid | Pobranie PID procesu |
Pełna lista dostępna jest w pliku /usr/include/asm/unistd_64.h
lub przez man 2
.
Jak sprawdzić użycie syscalli?
1. strace
To narzędzie pozwala śledzić wywołania systemowe wykonywane przez program:
strace ls
Wynik pokaże wszystkie syscalle, które ls
wykonuje — od open
po write
.
2. perf trace
Dla bardziej zaawansowanej analizy wydajności:
sudo perf trace
Dlaczego syscalle są ważne?
- Bezpieczeństwo: Użytkownik nie może bezpośrednio manipulować sprzętem
- Abstrakcja: Programy nie muszą znać szczegółów sprzętu
- Stabilność: Jądro kontroluje dostęp do zasobów
- Przenośność: API syscalli jest stabilne i dobrze udokumentowane
Ciekawostka: syscall vs funkcje C
Funkcje takie jak printf
, fopen
, malloc
to funkcje biblioteczne, które wewnętrznie mogą wywoływać syscalle. Np. printf
używa write
, a fopen
używa open
.
Podsumowanie
Syscall to brama między światem aplikacji a jądrem systemu. Bez nich Linux byłby tylko pustą powłoką. Zrozumienie ich działania pozwala lepiej pisać wydajne, bezpieczne i stabilne programy — szczególnie w językach niskiego poziomu jak C czy asembler.
Jeśli