Wywołania systemowe Linuxa 64-bit

Poniżej znajdują się wybrane wywołania systemowe Linuxa potrzebne do rozwiązania zadań. Pełne listy wywołań systemowych danego Linuxa można szukać w plikach

/usr/include/asm/unistd_32.h
/usr/include/asm/unistd_64.h

Argumenty wywołania możemy sprawdzić przez plecenie man np.

man 2 open
man 2 write

Numer wywołania systemowego umieszczamy w rejestrze RAX.

Argumenty umieszczamy kolejno w rejestrach EDI, ESI, EDX, R10, R8, R9.

Wywołanie systemowe może dodatkowo zmodyfikować wartość rejestrów RCX, R11.

Wyjście z programu (sys_exit)

  • Numer: RAX = 60
  • Parametry:
    • RDI = kod zakończenia programu

Zapis do pliku / na ekran (sys_write)

  • Numer: RAX = 1
  • Parametry:
    • RDI = deskryptor pliku (ekran = 1)
    • RSI = adres ciągu bajtów do zapiania
    • RDX = liczba bajtów w ciągu
  • Zwraca w EAX liczbę zapisanych bajtów lub kod błędu (liczba ujemna)

Odczyt z pliku / klawiatury (sys_read)

  • Numer: RAX = 0
  • Parametry:
    • RDI = deskryptor pliku (klawiatura = 0)
    • RSI = adres bufora docelowego
    • RDX = liczba bajtów do przeczytania
  • Zwraca w EAX liczbę przeczytanych bajtów lub kod błędu

Otwarcie pliku (sys_open)

  • Numer: RAX = 2
  • Parametry:
    • RDI = adres pod którym znajduje sie nazwa pliku (zakonczona zerem)
    • RSI = tryb pracy
    • RDX = prawa dostępu (jeżeli tworzymy nowy plik)
  • Zwraca w RAX deskryptor pliku lub kod błędu

Tryby pracy (z /usr/include/asm/fcntl.h)

nazwa ósemkowo opis
O_ACCMODE 3o Pełne prawa dostępu
O_RDONLY 0o Otwieranie tylko do odczytu. Dostępne dla sys_mq_open.
O_WRONLY 1o Otwieranie tylko do zapisu. Dostępne dla sys_mq_open.
O_RDWR 2o Otwieranie do odczytu i zapisu. Dostępne dla sys_mq_open.
O_CREAT 100o Utworzenie pliku. Dostępne dla sys_mq_open.
O_EXCL 200o Nie twórz pliku, jeśli już istnieje. Dostępne dla sys_mq_open.
O_NOCTTY 400o Jeśli podana nazwa pliku to terminal, to NIE zostanie on terminalem kontrolnym procesu.
O_TRUNC 1000o Obcięcie pliku
O_APPEND 2000o Dopisywanie do pliku
O_NONBLOCK 4000o Nie otwieraj, jeśli spowoduje to blokadę. Dostępne dla sys_mq_open.
O_NDELAY 4000o jak wyżej
O_SYNC 10000o specyficzne dla ext2 i urządzeń blokowych
FASYNC 20000o fcntl, dla zgodności z BSD
O_DIRECT 40000o podpowiedź bezpośredniego dostępu do dysku, obecnie ignorowana
O_LARGEFILE 100000o Pozwól na otwieranie plików >4GB
O_DIRECTORY 200000o musi być katalogiem
O_NOFOLLOW 400000o nie podążaj za linkami

Prawa dostępu (/usr/include/linux/stat.h)

nazwa ósemkowo komentarz
S_ISUID 4000o ustaw ID użytkownika przy wykonywaniu (suid)
S_ISGID 2000o ustaw ID grupy przy wykonywaniu (sgid)
S_ISVTX 1000o “sticky bit” - usuwać z takiego katalogu może tylko właściciel
S_IRUSR 400o czytanie przez właściciela (S_IREAD)
S_IWUSR 200o zapis przez właściciela (S_IWRITE)
S_IXUSR 100o wykonywanie/przeszukiwanie katalogu przez właściciela (S_IEXEC)
S_IRGRP 40o czytanie przez grupę
S_IWGRP 20o zapis przez grupę
S_IXGRP 10o wykonywanie/przeszukiwanie katalogu przez grupę
S_IROTH 4o czytanie przez innych (R_OK)
S_IWOTH 2o zapis przez innych (W_OK)
S_IWOTH 1o wykonywanie/przeszukiwanie katalogu przez innych (X_OK)
S_IRWXUGO 777o czytanie, pisanie i wykonywanie przez wszystkich
S_IALLUGO 7777o czytanie, pisanie i wykonywanie przez wszystkich + suid + sgid + sticky bit
S_IRUGO 444o czytanie dla wszystkich
S_IWUGO 222o zapis dla wszystkich
S_IXUGO 111o wykonywanie/przeszukiwanie katalogu dla wszystkich

Zamknięcie pliku (sys_close)

  • Numer: RAX = 3
  • Parametry:
    • RDI = deskryptor pliku
  • Zwraca w EAX kod błędu

Pobranie czasu systemowego (sys_time)

  • Numer: RAX = 201
  • Parametry:
    • RDI = NULL lub adres bufora, który otrzyma kopie wyniku
  • Zwraca w EAX liczbę sekund która upłynęła od 1 stycznia 1970 roku (minus 1)