Przeszedłem już odpowiedź na to pytanie, ale nie do końca rozumiem różnicę między wywołaniami systemowymi a funkcjami biblioteki. Koncepcyjnie, jaka jest różnica między nimi?
Przeszedłem już odpowiedź na to pytanie, ale nie do końca rozumiem różnicę między wywołaniami systemowymi a funkcjami biblioteki. Koncepcyjnie, jaka jest różnica między nimi?
Odpowiedzi:
Koncepcyjnie funkcja biblioteki jest częścią twojego procesu.
W czasie wykonywania kod wykonywalny i kod dowolnych bibliotek (takich jak libc.so), od których zależy, zostają połączone w jeden proces. Kiedy więc wywołujesz funkcję w takiej bibliotece, wykonuje się ją jako część twojego procesu, z tymi samymi zasobami i uprawnieniami. Jest to ten sam pomysł, jak wywoływanie funkcji, którą sam napisałeś (z możliwymi wyjątkami, takimi jak PLT i / lub funkcje trampoliny, które możesz sprawdzić, jeśli ci zależy).
Koncepcyjnie, wywołanie systemowe jest specjalnym interfejsem służącym do wywoływania twojego kodu (który jest ogólnie nieuprzywilejowany) do jądra (który ma prawo do eskalacji uprawnień w razie potrzeby).
Na przykład zobacz Linux man brk . Gdy program C wywołuje malloc
funkcję alokacji pamięci, wywołuje funkcję biblioteki w glibc.
Jeśli w procesie jest już wystarczająca ilość miejsca do alokacji , może on wykonać niezbędne zarządzanie stertą i zwrócić pamięć dzwoniącemu.
Jeśli nie, glibc musi zażądać więcej pamięci z jądra: (prawdopodobnie) wywołuje funkcję brk
glibc, która z kolei wywołuje brk
syscall. Dopiero po przejściu kontroli do jądra za pośrednictwem syscall można zmodyfikować stan globalnej pamięci wirtualnej, aby zarezerwować więcej pamięci i odwzorować ją w przestrzeni adresowej procesu.
Dodanie do bezużytecznej odpowiedzi:
funkcje biblioteki są szybsze niż wywołania systemowe i zwykle nie zawierają uwag dotyczących uprawnień / bezpieczeństwa, ponieważ działają z uprawnieniami procesu i jego pamięcią.
Z drugiej strony, Syscalls, ponieważ działają w jądrze, mają dostęp do wszystkiego w systemie, więc muszą kontrolować, co może wywołać proces wywoływania, gdy je wywołuje (sprawdź, czy ma uprawnienia do otwierania pliku, ponieważ przykład), ponadto, ponieważ syscalls znajdują się w jądrze, ich wywołanie wymaga przełącznika kontekstu w CPU, co jest bardzo ciężkim procesem w stosunku do zwykłego wywołania wywołania biblioteki.
Syscalls zwykle odzwierciedlają użycie procesora przez system w programach monitorujących.
wywołanie biblioteki - wywołuje podprogram połączony z aplikacją (poprzez dołączenie lub dodanie biblioteki).
wywołanie systemowe - przekazuje kontrolę do systemu operacyjnego (użytkownik-> proces systemowy> system operacyjny) i przełącza procesor w tryb uprzywilejowany