Opis funkcji systemowych syscall: 0-50

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

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

Najnowsze wersje jądra można znaleźć na www.kernel.org, a pliki z listą funkcji i ich numerów są pod ścieżkami:

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: 0-50
Numer/ RAX Opis ArgumentyZwraca
0
Czytanie z pliku (sys_read)
RDI = deskryptor pliku
RSI = adres bufora docelowego
RDX = liczba bajtów do przeczytania
RAX=liczba przeczytanych bajtów
RAX = błąd EAGAIN, EBADF, EFAULT, EINTR, EINVAL, EIO, EISDIR

1
Zapis do pliku (sys_write)
RDI = deskryptor pliku
RSI = adres bufora źródłowego
RDX = liczba bajtów do zapisania
RAX=liczba zapisanych bajtów
RAX = błąd EAGAIN, EBADF, EFAULT, EINTR, EINVAL, EIO, ENOSPC, EPIPE

2
Otwarcie pliku (sys_open)
RDI = adres nazwy pliku ASCIIZ
RSI = bity dostępu
RDX = prawa dostępu / tryb
RAX=deskryptor pliku
RAX = błąd EACCES, EEXIST, EFAULT, EISDIR, ELOOP, EMFILE, ENAMETOOLONG, ENFILE, ENOENT, ENODEV, ENODIR, ENOMEM, ENOSPC, ENXIO, EROFS, ETXTBSY

3
Zamknięcie pliku (sys_close)
RDI = deskryptor pliku
RAX = 0
RAX = błąd EBADF, EINTR, EIO

4
Pobierz status pliku (sys_stat)
RDI = adres nazwy pliku ASCIIZ. Jeśli plik jest linkiem, to zwracany jest status obiektu docelowego.
RSI = adres struktury stat
RAX = 0
RAX = błąd

5
Pobierz status pliku (sys_fstat)
RDI = deskryptor otwartego pliku
RSI = adres struktury stat
RAX = 0
RAX = błąd

6
Pobierz status pliku (sys_lstat)
RDI = adres nazwy pliku ASCIIZ. Jeśli plik jest linkiem, to zwracany jest status linku, a nie obiektu docelowego.
RSI = adres struktury stat
RAX = 0
RAX = błąd

7
Czekaj na zdarzenia na deskryptorze (sys_poll)
RDI = adres tablicy struktur pollfd
RSI = liczba struktur pollfd w tablicy
RDX = max. czas na oczekiwanie w milisekundach (-1 = nieskończoność)
RAX = liczba odpowiednich deskryptorów
RAX = 0, gdy czas upłynął
RAX = błąd EFAULT, EINTR, EINVAL

8
Zmiana bieżącej pozycji w pliku (sys_lseek)
RDI = deskryptor pliku
RSI = liczba bajtów, o którą chcemy się przesunąć
RDX = odkąd zaczynamy ruch
RAX = nowa pozycja względem początku pliku
RAX = błąd EBADF, EINVAL, EISPIPE

9
Mapuj plik/urządzenie do pamięci (sys_mmap)
-- zgodne z man 2 mmap--
RDI = proponowany adres początkowy
RSI = długość mapowanego obszaru
RDX = ochrona
R10 = flagi mapowania
R8 = deskryptor mapowanego pliku, jeśli mapowanie nie jest anonimowe
R9 = offset początku mapowanych danych w pliku
RAX = rzeczywisty adres mapowania
RAX = błąd

10
Kontrola dostępu do obszaru pamięci (sys_mprotect)
RDI = adres obszaru pamięci (wyrównany do granicy strony)
RSI = długość tego obszaru w bajtach (względem strony pamięci)
RDX = bity włączające ochronę
RAX=0
RAX = błąd EACCES, ENOMEM, EINVAL, EFAULT

11
Odmapuj plik/urządzenie z pamięci (sys_munmap)
RDI = adres początkowy obszaru
RSI = liczba bajtów
RAX = 0
RAX = błąd

12
Alokacja i dealokacja pamięci (sys_brk)
RDI = 0, aby poznać aktualny najwyższy adres sekcji .bss
RDI = (wirtualny) adres nowego wierzchołka .bss, powyżej spodu sekcji danych i poniżej bibliotek
RAX = nowy najwyższy adres
RAX = błąd ENOMEM

13
Pobierz i zmień procedurę obsługi sygnału (sys_rt_sigaction)
RDI = numer sygnału
RSI = adres struktury sigaction opisującą bieżącą procedurę
RDX = adres struktury sigaction opisującą starą procedurę
R10 = rozmiar struktury sigset_t
RAX = 0
RAX=błąd EINVAL, EFAULT

14
Pobierz i zmień blokowane sygnały (sys_rt_sigprocmask)
RDI = działanie
RSI = adres zestawu sygnałów (tablicy 32 DWORDów)
RDX = adres zestawu sygnałów, który otrzyma starą maskę sygnałów
R10 = rozmiar struktury sigset_t
RAX = 0
RAX=błąd EINVAL, EFAULT

15
Powrót z procedury obsługi sygnału (sys_rt_sigreturn)
-- funkcja wewnętrzna, nie używać--
RDI = parametr zależny od architektury
nigdy nie powraca

16
Manipulacja urządzeniem znakowym (sys_ioctl)
RDI = deskryptor pliku
RSI = kod komendy (man 2 ioctl_list)
RDX = adres zapisywalnego obszaru danych lub innej struktury, zależy od komendy
RAX = 0
RAX = błąd EBADF, EFAULT, EINVAL, ENOTTY

17
Czytaj z danej pozycji w pliku (sys_pread/sys_pread64)
RDI = deskryptor otwartego pliku
RSI = adres bufora, który otrzyma dane
RDX = liczba bajtów do odczytania
R10 = pozycja, z której zacząć czytanie
RAX = liczba przeczytanych bajtów (wskaźnik pozycji w pliku pozostaje bez zmian)
RAX = błąd (jak w sys_read)

18
Zapisuj na danej pozycji w pliku (sys_pwrite/sys_pwrite64)
RDI = deskryptor otwartego pliku
RSI = adres bufora, z którego pobierać dane do zapisania
RDX = liczba bajtów do zapisania
R10 = pozycja, od której zacząć zapisywanie
RAX = liczba zapisanych bajtów (wskaźnik pozycji w pliku pozostaje bez zmian)
RAX = błąd (jak w sys_read)

19
Czytaj wektor (sys_readv)
RDI = deskryptor otwartego obiektu, z którego będą czytane dane
RSI = adres tablicy struktur iovec
RDX = liczba struktur iovec, do których będą czytane dane
RAX = 0
RAX = błąd EWOULDBLOCK, EBADF, EINTR, EINVAL, ENOLCK

20
Zapisz wektor (sys_writev)
RDI = deskryptor otwartego obiektu, do którego będą zapisane dane
RSI = adres tablicy struktur iovec
RDX = liczba struktur iovec, z których będą czytane dane do zapisania
RAX = 0
RAX = błąd EWOULDBLOCK, EBADF, EINTR, EINVAL, ENOLCK

21
Sprawdź uprawnienia dostępu do pliku (sys_access)
RDI = adres nazwy pliku ASCIIZ
RSI = prawa dostępu / tryb (wartości R_OK, W_OK, X_OK)
RAX = 0
RAX = błąd - każdy związany z systemem plików i plikami

22
Utwórz potok (sys_pipe)
RDI = adres tablicy dwóch DWORDów
RAX = 0 i pod [RDI]: deskryptor odczytu z potoku fd(0) pod [RDI], deskryptor zapisu do potoku fd(1) pod [RDI+4]
RAX = błąd EFAULT, EMFILE, ENFILE

23
Oczekiwanie zmiany stanu deskryptora(ów) (sys_select)
RDI = najwyższy numer spośród deskryptorów + 1
RSI = adres tablicy deskryptorów sprawdzanych, czy można z nich czytać
RDX = adres tablicy deskryptorów sprawdzanych, czy można do nich pisać
R10 = adres tablicy deskryptorów 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 = wystąpił błąd

24
Oddanie procesora innym procesom (sys_sched_yield)
nic
RAX = 0
RAX = błąd.

25
Przemapuj adres wirtualny (sys_mremap)
RDI = stary adres
RSI = rozmiar obszaru do przemapowania
RDX = żądany rozmiar
R10 = zero lub flagi przemapowania
R8 = nowy adres, jeśli dano flagę MREMAP_FIXED
RAX = wskaźnik do nowego obszaru
RAX = sygnał lub błąd EFAULT, EAGAIN, ENOMEM, EINVAL

26
Synchronizuj mapowany plik z pamięcią (sys_msync)
RDI = adres do zrzucenia na dysk (zostaną zrzucone zmodyfikowane strony pamięci zawierającej ten adres i co najwyżej RSI-1 zmienionych następnych)
RSI = liczba bajtów/rozmiar obszaru do zrzucenia na dysk
RDX = 0 lub zORowane flagi
RAX = 0
RAX = błąd EBUSY, EIO, ENOMEM, EINVAL, ENOLCK

27
Pobierz informację, czy strony pamięci są w rdzeniu procesu (sys_mincore)
RDI = adres początkowy sprawdzanych bajtów
RSI = liczba sprawdzanych bajtów
RDX = adres tablicy bajtów zdolnej pomieścić tyle bajtów, ile stron pamięci jest sprawdzanych. Najmłodszy bit w każdym bajcie będzie mówił o tym, czy dana strona pamięci jest obecna (=1), czy zrzucona na dysk (=0)
RAX = 0
RAX = błąd EAGAIN, EINVAL, EFAULT, ENOMEM

28
Porada dla jądra o użyciu pamięci (sys_madvise, sys_madvise1)
RDI = adres początkowy bajtów, których dotoczy porada
RSI = liczba tych bajtów
RDX = porada
RAX = 0
RAX = błąd EAGAIN, EINVAL, EFAULT, ENOMEM

29
Alokuj współdzielony segment pamięci (sys_shmget)
RDI = klucz opisujący segment pamięci
RSI = długość segmentu
RDX = flagi shmget
RAX = identyfikator segmentu
RAX = błąd EACCES, EEXIST, EINVAL, ENFILE, ENOENT, ENOMEM, ENOSPC, EPERM

30
Podłącz współdzielony segment pamięci (sys_shmat)
RDI = identyfikator segmentu pamięci
RSI = adres podłączenia segmentu do pamięci procesu lub 0
RDX = flagi shmat
RAX = adres podłączonego segmentu
RAX = błąd EACCES, EINVAL, ENOMEM

31
Kontrola współdzielonej pamięci (sys_shmctl)
RDI = identyfikator segmentu pamięci
RSI = rozkaz
RDX = adres struktury shmid_ds
RAX = wartość odpowiednia dla rozkazu
RAX = błąd EACCES, EINVAL, EFAULT, EIDRM, ENOMEM, EOVERFLOW, EPERM

32
Zduplikuj deskryptor pliku (sys_dup)
RDI = stary deskryptor
RAX = nowy deskryptor
RAX = błąd EBADF, EMFILE

33
Zamień deskryptor zduplikowanym deskryptorem pliku (sys_dup2)
RDI = deskryptor do zduplikowania
RSI = deskryptor, do którego powinien być przyznany duplikat
RAX = zduplikowany deskryptor
RAX = błąd EBADF, EMFILE, EBUSY, EINTR

34
Pauza - śpij aż do otrzymania sygnału (sys_pause)
nic
wraca tylko po sygnale, o ile procedura jego obsługi ma powrót. RAX = EINTR po sygnale

35
Pauza w wykonywaniu programu (sys_nanosleep)
RDI = adres struktury timespec
RSI = NULL lub adres modyfikowalnej struktury timespec, która otrzyma resztkę czasu, która została
RAX = 0
RAX = sygnał lub błąd EINTR, EINVAL

36
Pobierz wartość czasomierza (sys_getitimer)
RDI = numer czasomierza
RSI = adres struktury itimerval, która otrzyma wartość czasomierza
RAX = 0
RAX = błąd

37
Alarm - wysłanie sygnału SIGALARM (sys_alarm)
RDI = sekundy
RAX = 0 lub liczba sekund do wykonania poprzednich alarmów

38
Ustaw wartość czasomierza (sys_setitimer)
RDI = numer czasomierza
RSI = adres struktury itimerval zawierającej nową wartość czasomierza
RSI = adres struktury itimerval, która otrzyma starą wartość czasomierza
RAX = 0
RAX = błąd

39
Pobierz identyfikator bieżącego procesu (sys_getpid)
nic
RAX = PID bieżącego procesu

40
Kopiuj dane między deskryptorami plików (sys_sendfile, sys_sendfile64)
RDI = deskryptor pliku wyjściowego, otwartego do zapisu
RSI = deskryptor pliku wejściowego
RDX = adres 64-bitowej zmiennej - numeru bajtu w pliku źródłowym, od którego zacząć kopiować
R10 = liczba bajtów do skopiowania
RAX = liczba zapisanych bajtów
RAX = błąd EBADF, EAGAIN, EINVAL, ENOMEM, EIO, EFAULT

41
Tworzenie gniazda (sys_socket)
RDI = domena tworzonego gniazda
RSI = typ tworzonego gniazda
RDX = protokół dla tworzonego gniazda (zwykle 0, patrz: man 5 protocols, man 3 getprotoent)
RAX = deskryptor nowego gniazda
RAX = błąd EINVAL, EACCES, EAFNOSUPPORT, EMFILE, ENFILE, ENOBUFS/ENOMEM, EPROTONOSUPPORT

42
Połączenie gniazda (sys_connect)
RDI = deskryptor gniazda
RSI = adres struktury sockaddr (zależnej od protokołu), opisującej adres, z którym się łączymy
RDX = wielkość struktury, na którą wskazuje RSI
RAX = 0
RAX = błąd EACCES, EPERM, EADDRINUSE, EAFNOSUPPORT, EAGAIN, EALREADY, EBADF, ECONNREFUSED, EFAULT, EINPROGRESS, EINTR, EISCONN, ENETUNREACH, ENOTSOCK, ETIMEDOUT

43
Przyjmowanie połączenia na gnieździe (sys_accept)
RDI = deskryptor gniazda
RSI = adres struktury sockaddr (zależnej od protokołu), która otrzyma adres, z którego połączono się do tego gniazda
RDX = adres zmiennej (32-bitowej), która otrzyma wielkość struktury, na którą wskazuje RSI
RAX = deskryptor gniazda do połączonego klienta
RAX = błąd EAGAIN/EWOULDBLOCK, EBADF, ECONNABORTED, EFAULT, EINTR, EINVAL, EMFILE, ENFILE, ENOBUFS, ENOMEM, ENOTSOCK, EOPNOTSUPP, EPROTO, EPERM

44
Wysyłanie danych gniazdem (sys_sendto)
RDI = deskryptor gniazda
RSI = adres bufora z danymi do wysłania
RDX = liczba bajtów z bufora do wysłania
R10 = flagi sendto
R8 = adres struktury sockaddr (zależnej od protokołu), opisującej adres, do którego wysłać dane. Ignorowane dla gniazd opartych o połączenie
R9 = wielkość struktury, na którą wskazuje R8. Ignorowane dla gniazd opartych o połączenie
RAX = liczba wysłanych znaków
RAX = błąd EACCES, EAGAIN, EWOULDBLOCK, EBADF, ECONNRESET, EDESTADDRREQ, EFAULT, EINTR, EINVAL, EISCONN, EMSGSIZE, ENOBUFS, ENOMEM, ENOTCONN, ENOTSOCK, EOPNOTSUPP, EPIPE

45
Odbieranie danych gniazdem (sys_recvfrom)
RDI = deskryptor gniazda
RSI = adres bufora na odebrane dane
RDX = liczba bajtów w buforze
R10 = flagi recvfrom
R8 = adres struktury sockaddr (zależnej od protokołu), która otrzyma adres, z którego otrzymano dane. Może być 0.
R9 = adres zmiennej (32-bitowej), która otrzyma wielkość struktury, na którą wskazuje R8. Może być 0.
RAX = liczba odebranych znaków
RAX = błąd EAGAIN, EWOULDBLOCK, EBADF, ECONNREFUSED, EFAULT, EINTR, EINVAL, ENOMEM, ENOTCONN, ENOTSOCK

46
Wysyłanie wiadomości gniazdem (sys_sendmsg)
RDI = deskryptor gniazda
RSI = adres struktury msghdr opisującej wiadomość
RDX = flagi sendmsg (te same, co dla sendto)
RAX = liczba wysłanych znaków
RAX = błąd EACCES, EAGAIN, EWOULDBLOCK, EBADF, ECONNRESET, EDESTADDRREQ, EFAULT, EINTR, EINVAL, EISCONN, EMSGSIZE, ENOBUFS, ENOMEM, ENOTCONN, ENOTSOCK, EOPNOTSUPP, EPIPE

47
Odbieranie wiadomości gniazdem (sys_recvmsg)
RDI = deskryptor gniazda
RSI = adres struktury msghdr opisującej wiadomość
RDX = flagi recvmsg (te same, co dla recvfrom)
RAX = liczba odebranych znaków
RAX = błąd EAGAIN, EWOULDBLOCK, EBADF, ECONNREFUSED, EFAULT, EINTR, EINVAL, ENOMEM, ENOTCONN, ENOTSOCK

48
Zamknięcie części połączenia (sys_shutdown)
RDI = deskryptor gniazda
RSI = sposób zamknięcia (SHUT_RD=0 blokuje odczyty, SHUT_WR=1 blokuje zapisy, SHUT_RDWR=2 blokuje odczyty i zapisy)
RAX = 0
RAX = błąd EBADF, ENOTCONN, ENOTSOCK

49
Przypisanie gniazda do adresu (sys_bind)
RDI = deskryptor gniazda
RSI = adres struktury sockaddr (zależnej od protokołu), opisującej adres, do którego chcemy przypisać gniazdo
RDX = wielkość struktury, na którą wskazuje RSI
RAX = 0
RAX = błąd EACCES, EADDRINUSE, EBADF, EINVAL, ENOTSOCK, EADDRNOTAVAIL, EFAULT, ELOOP, ENAMETOOLONG, ENOENT, ENOMEM, ENOTDIR, EROFS

50
Oczekiwanie na połączenia na gnieździe (sys_listen)
RDI = deskryptor gniazda
RSI = maksymalna liczba połączeń oczekujących
RAX = 0
RAX = błąd EADDRINUSE, EBADF, ENOTSOCK, EOPNOTSUPP



Kolejna część (klawisz dostępu 4)
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)