Gdzie mogę znaleźć kod źródłowy wywołania systemowego?

W Linuksie gdzie mogę znaleźć kod źródłowy dla wszystkich wywołań systemowych, biorąc pod uwagę, że mam drzewo źródłowe? Również jeśli miałbym chcieć wyszukać kod źródłowy i assembly dla konkretnego wywołania systemowego, czy jest coś, co mogę wpisać w terminalu, jak-my_system_call?

Author: Dr.Knowitall, 2012-04-14

3 answers

Będziesz potrzebował źródeł jądra Linuksa, aby zobaczyć rzeczywiste źródło wywołań systemowych. Strony podręcznika ekranowego, Jeśli są zainstalowane w systemie lokalnym, zawierają tylko dokumentację wywołań, a nie ich źródło.

Niestety dla Ciebie, wywołania systemowe nie są przechowywane tylko w jednym konkretnym miejscu w całym drzewie jądra. Dzieje się tak, ponieważ różne wywołania systemowe mogą odnosić się do różnych części systemu (zarządzanie procesami, zarządzanie systemem plików, itd.) i dlatego byłoby nie ma możliwości przechowywania ich poza częścią drzewa związaną z tą konkretną częścią systemu.

Najlepsze, co możesz zrobić, to poszukać makra SYSCALL_DEFINE[0-6]. Jest on używany (oczywiście) do zdefiniowania danego bloku kodu jako wywołania systemowego. Na przykład, fs/ioctl.c ma następujący kod:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
{
/* do freaky ioctl stuff */
}

Taka definicja oznacza, że syscall ioctl jest zadeklarowany i przyjmuje trzy argumenty. Liczba obok SYSCALL_DEFINE oznacza liczbę argumentów. Na przykład, w przypadku getpid(void), deklarowane w kernel/timer.c mamy następujący kod:

SYSCALL_DEFINE0(getpid)
{
        return task_tgid_vnr(current);
}

Mam nadzieję,że to trochę wyjaśni.

 31
Author: Daniel Kamil Kozar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-14 00:07:14

Z punktu widzenia aplikacji, wywołanie systemowe jest elementarną i atomową operacją wykonywaną przez jądro .

Assembly Howtowyjaśnia, co się dzieje, w kategoriach instrukcji maszynowej.

Oczywiście, jądro robi wiele rzeczy podczas obsługi syscall.

Właściwie, prawie można by uwierzyć, że cały kod jądra jest przeznaczony do obsługi wszystkich wywołań systemowych (nie jest to do końca prawda, ale prawie; z punktu widzenia aplikacji widoku, jądro jest widoczne tylko przez wywołania systemowe). Druga odpowiedź Daniela Kamila Kozara wyjaśnia, jaka funkcja jądra rozpoczyna obsługę jakiegoś wywołania systemowego (ale bardzo często wiele innych części jądra pośrednio uczestniczy w wywołaniach systemowych; na przykład scheduler uczestniczy pośrednio w implementacji fork, ponieważ zarządza procesem potomnym utworzonym przez pomyślny syscall fork).

 2
Author: Basile Starynkevitch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:01

Wiem, że jest stary, ale też Szukałem źródła _system_call() i znalazłem tę ciekawostkę

Rzeczywisty kod dla punktu wejścia system_call można znaleźć w /usr / src/linux/kernel / sys_call.S rzeczywisty kod dla wielu wywołań systemowych można znaleźć w /usr / src/linux/kernel / sys.c, a reszta znajduje się gdzie indziej. find to twój przyjaciel.

Zakładam, że to datowane, bo nawet nie mam tego pliku. Jednak grep znalazł ENTRY(system_call) w arch/x86/kernel / entry_64.S i wydaje się być coś, co wywołuje poszczególne wywołania systemowe. Nie jestem teraz na moim intel-syntax x86 asm, więc będziesz musiał spojrzeć i zobaczyć, czy to jest to, co chciałeś.
 2
Author: KitsuneYMG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-04 14:50:20