Opis funkcji systemowych syscall

Jeśli jakaś funkcja zakończy się błędem, w RAX zwracana jest wartość ujemna z przedziału od -4096 do -1 włącznie.

Z drugiej strony, opisy funkcji na stronach manuala mówią, że zwracane jest -1, a wartość błędu jest zapisywana do zmiennej errno z biblioteki GLIBC. Dzieje się tak tylko w przypadku, gdy korzystamy z interfejsu języka C (czyli deklarujemy i uruchamiamy zewnętrzne funkcje odpowiadające wywołaniom systemowym i linkujemy nasz program z biblioteką języka C), a nie bezpośrednio z wywołań systemowych (czyli syscall).

Najaktualniejsze informacje o funkcjach systemowych można znaleźć zazwyczaj w sekcji 2 (lub 3) manuala, na przykład man 2 open

Najnowsze wersje stron manuala można znaleźć tu: www.kernel.org/pub/linux/docs/man-pages.

Napis ASCIIZ oznacza łańcuch znaków ASCII zakończony znakiem/bajtem Zerowym.

Jeśli potrzeba, przy każdej funkcji jest odnośnik do opisu argumentów i innych dodatkowych informacji: typów danych, wartości błędów, możliwych wartości parametrów itp.

Podstawowe funkcje syscall: funkcje bez numerów
Numer/ RAX Opis ArgumentyZwraca
-
Czekaj na zmianę stanu innego procesu (sys_waitpid)
RDI = id procesu / specyfikacja
RSI = NULL lub adres zmiennej DWORD, która otrzyma status
RDX = opcje
RAX=PID zakończonego procesu
[RSI] = (jeśli podano adres bufora) stan wyjścia procesu
RAX = błąd ECHILD, EINVAL, ERESTARTSYS

-
Funkcja systemowa sys_break
(porzucone)
Istnieje tylko dla zachowania zgodności
RAX = błąd ENOSYS

-
Funkcja systemowa sys_oldstat
(porzucone)
 
 

-
Odmontowanie systemu plików (sys_umount)
RDI = adres nazwy pliku specjalnego lub katalogu (zamontowanego)
nic
RAX = błąd - każdy, który może się zdarzyć w systemie plików lub jądrze

-
Ustaw czas systemowy (sys_stime)
RDI = nowy czas jako liczba sekund, które upłynęły od 1 Stycznia 1970
nic
RAX = błąd EPERM

-
Funkcja systemowa sys_oldfstat
(porzucone)
 
 

-
Funkcja systemowa sys_stty
(porzucone)
--nieużywane od 2.0--
zawsze RAX = -1

-
Funkcja systemowa sys_gtty
(porzucone)
--nieużywane od 2.0--
zawsze RAX = -1

-
Zmień priorytet procesu (sys_nice)
RDI = liczba, o którą zwiększyć numer priorytetu (czyli zmniejszyć sam priorytet)
nic
RAX = błąd EPERM

-
Pobierz bieżącą datę i czas - sys_ftime
(przestarzałe)
--zamiast tego, używaj time, gettimeofday--
RDI = adres struktury timeb
zawsze RAX = 0

-
Funkcja systemowa sys_prof
(porzucone)
niezaimplementowane w jądrach 2.4
zawsze RAX = -1, błąd ENOSYS

-
Ustaw procedurę obsługi sygnału (sys_signal)
RDI = numer sygnału
RSI = adres procedury przyjmującej int i zwracającą void (nic) lub wartość SIG_IGN=1 (ignoruj sygnał) lub SIG_DFL=0 (resetuj sygnał na domyślne zachowanie)
RAX = adres poprzedniej procedury obsługi
RAX = błąd SIG_ERR

-
Funkcja systemowa sys_lock (porzucone)
--nieużywane od 2.0--
zawsze RAX = -1

-
Funkcja systemowa sys_mpx (porzucone)
--nieużywane od 2.0--
zawsze RAX = -1

-
Pobierz/ustaw limity zasobów (sys_ulimit)
--nieużywane (zamiast tego używaj getrlimit, setrlimit, sysconf)--
man 3 ulimit
RDI = komenda, patrz: sys_ulimit
RSI = nowy limit
RAX = aktualny limit
RAX = -1, gdy błąd

-
Funkcja systemowa sys_oldolduname (porzucone)
 
 

-
Pobierz/ustal procedurę obsługi sygnału (sys_sigaction)
RDI = numer sygnału
RSI = adres struktury sigaction opisującą bieżącą procedurę
RDX = adres struktury sigaction opisującą starą procedurę
nic
RAX=błąd EINVAL, EINTR, EFAULT

-
Pobierz maskę sygnałów procesu (sys_sgetmask)
--przestarzałe (zamiast tego używaj sys_sigprocmask)--
RAX = maska sygnałów bieżącego procesu

-
Ustaw maskę sygnałów procesu (sys_ssetmask)
--przestarzałe (zamiast tego używaj sys_sigprocmask)--
RDI = nowa maska sygnałów procesu
RAX = poprzednia maska sygnałów

-
Zastąpienie dla sigpause - sys_sigsuspend
RDI = adres nowej maski sygnałowej procesu - struktury sigset_t
RAX = 0
RAX = -1, gdy błąd

-
Pobierz trwające blokujące sygnały (sys_sigpending)
RDI = adres maski sygnałów - struktury sigset_t
RAX = 0
RAX = -1, gdy błąd

-
Czytaj katalog (sys_readdir)
RDI = deskryptor otwartego katalogu
RSI = adres struktury dirent
RDX = liczba struktur do odczytania (ignorowane, czytana jest 1 struktura)
RAX = 1
RAX = 0 na końcu katalogu
RAX = -1, gdy błąd

-
Profilowanie czasu wykonywania (sys_profil)
--man 3 profil--
RDI = adres tablicy WORDów
RSI = długość tej tablicy, na którą pokazuje RDI
RDX = offset początkowy
R10 = mnożnik
zawsze RAX = 0

-
Funkcja systemowa sys_olduname (porzucone)
 
 

-
Spowoduj bezczynność procesu 0 (sys_idle)
nic
dla procesu nr 0 nigdy nie wraca.
Dla pozostałych zwraca RAX = -1 (EPERM)

-
Przejdź w tryb wirtualny 8086 (sys_vm86old)
--to było przed jądrem 2.0.38--
RDI = adres struktury vm86_struct
RAX = 0
RAX = -1, gdy błąd

-
Komunikacja międzyprocesowa SysV (sys_ipc)
RDI = numer wywoływanej funkcji
RSI, RDX, R10 = parametry 1-3 wywoływanej funkcji
R8 = adres dalszych parametrów, jeśli trzeba
R9 = parametr piąty
zależy od wywoływanej funkcji

-
Powrót z procedury obsługi sygnału (sys_sigreturn)
RDI = argument zależny od architektury, używany przez jądro
nigdy nie powraca

-
Zmiana listy blokowanych sygnałów (sys_sigprocmask)
RDI = co zrobić
RSI = adres struktury sigset_t
RDX = adres struktury sigset_t (do przechowania starej maski) lub 0
RAX = 0
RAX = -1, gdy błąd EINVAL, EPERM, EFAULT

-
Demon wypróżniania buforów (sys_bdflush)
RDI = komenda demona
RSI = dodatkowy parametr, zależny od komendy
RAX=0, gdy sukces i RDI>0
RAX = -1, gdy błąd EPERM, EFAULT, EBUSY, EINVAL

-
Zmiana bieżącej pozycji w dużym pliku (sys_llseek)
RDI = deskryptor otwartego pliku
ECX:RSI = liczba bajtów, o którą chcemy się przesunąć
RDX = adres QWORDa, który otrzyma nową pozycję w pliku (big endian?)
R10 = odkąd zaczynamy ruch
RAX = 0
RAX = błąd EBADF, EINVAL

-
Oczekiwanie zmiany stanu deskryptora(ów) (sys_newselect)
RDI = najwyższy numer spośród deskryptorów + 1 (co najwyżej FILE_MAX)
RSI = adres tablicy deskryptorów (lub 0) sprawdzanych, czy można z nich czytać
RDX = adres tablicy deskryptorów (lub 0) sprawdzanych, czy można do nich pisać
R10 = adres tablicy deskryptorów (lub 0) sprawdzanych, czy nie wystąpił u nich wyjątek
R8 = adres struktury timeval zawierającą maksymalny czas oczekiwania

RAX = całkowita liczba deskryptorów, która pozostała w tablicach
RAX = 0, gdy skończył się czas
RAX = -1, gdy wystąpił błąd EBADF, EINVAL, ENOMEM, EINTR

-
Uruchom tryb wirtualny 8086 (sys_vm86)
RDI = kod funkcji
RSI = adres struktury vm86plus_struct
(zależy od numeru funkcji)
RAX = -1, gdy błąd EFAULT

-
Pobierz limity zasobów (sys_ugetrlimit)
patrz: sys_getrlimit (?)
nic
RAX = błąd EFAULT, EINVAL, EPERM

-
Mapuj urządzenie lub plik do pamięci (sys_mmap2)
RDI = proponowany adres początkowy
RSI = liczba bajtów pliku do zmapowania
RDX = ochrona
R10 = flagi mapowania
R8 = deskryptor mapowanego pliku, jeśli mapowanie nie jest anonimowe
R9 = offset początku mapowanych danych w pliku, liczony w jednostkach wielkości strony systemowej zamiast w bajtach
RAX = adres zmapowanego obszaru
RAX = -1, gdy błąd (takie same jak w sys_mmap + EFAULT)

-
Skróć plik, wersja 64-bitowa (sys_truncate64)
RDI = adres nazwy pliku ASCIIZ
RSI = liczba bajtów, do której ma zostać skrócony plik (niższy DWORD)
RDX = liczba bajtów, do której ma zostać skrócony plik (wyższy DWORD)
RAX = 0
RAX = -1, gdy błąd

-
Skróć plik, wersja 64-bitowa (sys_ftruncate64)
RDI = deskryptor pliku otwartego do zapisu
RSI = liczba bajtów, do której ma zostać skrócony plik (niższy DWORD)
RDX = liczba bajtów, do której ma zostać skrócony plik (wyższy DWORD)
RAX = 0
RAX = -1, gdy błąd

-
Pobierz status pliku, wersja 64-bitowa (sys_stat64)
RDI = adres nazwy pliku ASCIIZ. Jeśli plik jest linkiem, to zwracany jest status obiektu docelowego.
RSI = adres struktury stat64
RAX = 0
RAX = -1, gdy błąd

-
Pobierz status pliku, wersja 64-bitowa (sys_lstat64)
RDI = adres nazwy pliku ASCIIZ. Jeśli plik jest linkiem, to zwracany jest status linku, a nie obiektu docelowego.
RSI = adres struktury stat64
RAX = 0
RAX = -1, gdy błąd

-
Pobierz status pliku, wersja 64-bitowa (sys_fstat64)
RDI = deskryptor otwartego pliku
RSI = adres struktury stat64
RAX = 0
RAX = -1, gdy błąd

-
Zmiana właściciela (sys_lchown32)
RDI = adres nazwy pliku/katalogu ASCIIZ
RSI = nowy numer użytkownika
RDX = nowy numer grupy
nic
RAX = błąd EPERM, EROFS, EFAULT, ENAMETOOLONG, ENOENT, ENOMEM, ENOTDIR, EACCES, ELOOP i inne

-
Pobierz identyfikator użytkownika (sys_getuid32)
nic
RAX = numer UID

-
Pobierz ID grupy bieżącego procesu (sys_getgid32)
nic
RAX = ID grupy

-
Pobierz efektywne ID użytkownika bieżącego procesu (sys_geteuid32)
nic
RAX = efektywny UID

-
Pobierz efektywne ID grupy bieżącego procesu (sys_getegid32)
nic
RAX = efektywny GID

-
Ustaw realny i efektywny ID użytkownika (sys_setreuid32)
RDI = realny ID użytkownika (UID)
RSI = efektywny UID
nic
RAX = błąd EPERM

-
Ustaw realny i efektywny ID grupy (sys_setregid32)
RDI = realny ID grupy (GID)
RSI = efektywny GID
nic
RAX = błąd EPERM

-
Pobierz liczbę dodatkowych grup (sys_getgroups32)
RDI = rozmiar tablicy z RSI
RSI = adres tablicy, gdzie zostaną zapisane GID-y (DWORDY) grup dodatkowych
RAX = liczba dodatkowych grup procesu
RAX = -1 oznacza błąd (EFAULT, EINVAL, EPERM)

-
Ustaw liczbę dodatkowych grup (sys_setgroups32)
RDI = rozmiar tablicy z RSI
RSI = adres tablicy, gdzie zawierającą GID-y (DWORDY)
RAX = 0
RAX = -1 oznacza błąd (EFAULT, EINVAL, EPERM)

-
Zmiana właściciela (sys_fchown32)
RDI = deskryptor otwartego pliku
RSI = nowy numer użytkownika
RDX = nowy numer grupy
RAX = 0
RAX = -1, gdy błąd

-
Ustaw różne ID użytkownika (sys_setresuid32)
RDI = realny UID lub -1 (wtedy jest bez zmian)
RSI = efektywny UID lub -1 (bez zmian)
RDX = zachowany (saved) UID lub -1 (bez zmian)
RAX = 0
RAX = -1, gdy błąd EPERM

-
Pobierz różne ID użytkownika (sys_getresuid32)
RDI = adres DWORDa, który otrzyma realny UID
RSI = adres DWORDa, który otrzyma efektywny UID
RDX = adres DWORDa, który otrzyma zachowany UID
RAX = 0
RAX = -1, gdy błąd EFAULT

-
Ustaw realny, efektywny i zachowany ID grupy (sys_setresgid32)
RDI = realny GID
RSI = efektywny GID
RDX = zachowany (saved) GID
RAX = 0
RAX = -1, gdy błąd EPERM

-
Pobierz realny, efektywny i zachowany ID grupy (sys_getresgid32)
RDI = adres DWORDa, który otrzyma realny GID
RSI = adres DWORDa, który otrzyma efektywny GID
RDX = adres DWORDa, który otrzyma zachowany (saved) GID
RAX = 0
RAX = -1, gdy błąd EFAULT

-
Zmiana właściciela pliku (sys_chown32)
RDI=adres ścieżki do pliku
RSI = UID nowego właściciela
RDX = GID nowej grupy
RAX = 0
RAX = -1, gdy błąd na przykład EPERM, EROFS, EFAULT, ENOENT, ENAMETOOLONG, ENOMEM, ENOTDIR, EACCES, ELOOP

-
Ustaw identyfikator użytkownika (sys_setuid32)
RDI = nowy UID
nic
RAX = błąd EPERM

-
Ustaw ID grupy bieżącego procesu (sys_setgid32)
RDI = nowy ID grupy
nic
RAX = błąd EPERM

-
Ustal UID przy sprawdzaniu systemów plików (sys_setfsuid32)
RDI = nowy ID użytkownika
RAX = stary UID (zawsze)

-
Ustal GID przy sprawdzaniu systemów plików (sys_setfsgid32)
RDI = nowy ID grupy
RAX = stary GID (zawsze)

-
Kontrola nad deskryptorem pliku, wersja 64-bitowa (sys_fcntl64)
RDI = deskryptor pliku
RSI = kod komendy
RDX zależy od komendy
RAX zależy od komendy
RAX = błąd EACCES, EAGAIN, EBADF, EDEADLK, EFAULT, EINTR, EINVAL, EMFILE, ENOLOCK, EPERM

-
brak danych
-
-

-
Funkcja systemowa sys_alloc_hugepages
zaimplementowane tylko w jądrach 2.5.36 - 2.5.54, więc nie będę omawiał
zawsze RAX = -1, błąd ENOSYS

-
Funkcja systemowa sys_free_hugepages
zaimplementowane tylko w jądrach 2.5.36 - 2.5.54, więc nie będę omawiał
zawsze RAX = -1, błąd ENOSYS

-
Pobierz statystyki systemu plików, wersja 64-bitowa (sys_statfs64)
RDI = adres nazwy dowolnego pliku w zamontowanym systemie plików
RSI adres struktury statfs64
RAX = 0
RAX = -1, gdy błąd

-
Pobierz statystyki systemu plików, wersja 64-bitowa (sys_fstatfs64)
RDI = deskryptor dowolnego otwartego pliku w zamontowanym systemie plików
RSI = adres struktury statfs64
RAX = 0
RAX = -1, gdy błąd

-
sys_setaltroot
nieużywane
brak danych

-
Funkcja systemowa sys_oldlstat (porzucone)
 
 



Poprzednia część (klawisz dostępu 3)
Spis treści off-line (klawisz dostępu 1)
Spis treści on-line (klawisz dostępu 2)
Ułatwienia dla niepełnosprawnych (klawisz dostępu 0)