Jaka jest różnica między wywołaniem bibliotecznym a wywołaniem systemowym w systemie Linux?

13

Chciałbym wiedzieć, jaka jest różnica między wywołaniem bibliotecznym a wywołaniem systemowym w systemie Linux. Wszelkie wskazówki dla dobrego zrozumienia pojęć obu będą bardzo mile widziane.

Sen
źródło

Odpowiedzi:

9

Tak naprawdę nie ma czegoś takiego jak „wywołanie biblioteczne”. Możesz wywołać funkcję połączoną z biblioteką współdzieloną. A to po prostu oznacza, że ​​ścieżka biblioteki jest sprawdzana w czasie wykonywania, aby określić lokalizację funkcji do wywołania.

Wywołania systemowe są niskopoziomowymi wywołaniami jądra obsługiwanymi przez jądro.

Falmarri
źródło
Więc jeśli ktoś zadaje powyższe pytanie, mogę to zinterpretować jako różnicę między wywołaniem systemowym a wywołaniem funkcji.
Sen
„man ltrace” daje moje „
Tracer
8

Jeśli wpiszesz man manswoją powłokę, zobaczysz listę podręczników

2 wywołania systemowe (funkcje dostarczane przez jądro)

3 wywołania biblioteczne (funkcje w bibliotekach programów)

Na przykład znajdziesz chmodw rozdziale 2 instrukcji podczas pisania man chmod. I fprintfw sekcji 3.

uloBasEI
źródło
3

Wywołania systemowe są obsługiwane bezpośrednio przez jądro.

Wywołania biblioteczne są obsługiwane przez bibliotekę dynamiczną (lub statycznie połączoną). Program wykonujący wywołanie biblioteki musi najpierw zaimportować tę bibliotekę, zanim wywołanie zadziała. Same wywołania biblioteki mogą korzystać z wywołań systemowych.

Czasami biblioteki są dostarczane jako „front-end” dla wywołań systemowych, aby zapewnić dodatkową funkcjonalność lub łatwość użycia, których nie zapewnia jądro.

LawrenceC
źródło
Wywołania biblioteczne niekoniecznie są obsługiwane przez bibliotekę dynamiczną. Biblioteki można łączyć statycznie, więc nie jest wymagany import (ładowanie).
jlliagre
Prawdziwe. Dodałem tę informację.
LawrenceC,
Tylko połowa tego ...
Jlliagre
czy nie powinno działać w pliku tylko na głowie, które powinno być częścią wywołań biblioteki?
1

Wywołania systemowe to funkcje, które system operacyjny udostępnia aplikacjom. Natomiast funkcje takie jak te w math.h, string.h itp. To te, które nie mają nic wspólnego z interfejsem z systemem operacyjnym.

yasouser
źródło
1

Zasadniczo istnieją dwa tryby jądra Linuxa.

  1. Tryb użytkownika,
  2. Tryb jądra.

Każde jądro Linuksa przełącza się pomiędzy tymi dwoma trybami. Zasadniczo wywołania biblioteczne są wykonywane w trybie użytkownika, a wywołania systemowe są wykonywane w trybie jądra . Pod względem systemu operacyjnego tryb jądra ma charakter atomowy, a tryb nadzorczy. Prawie wszystkie wywołania biblioteki potrzebują pomocy jądra do wykonywania swoich zadań. Każde wywołanie biblioteki z kolei wywołuje wywołanie systemowe. Uczyńmy ten pomysł jaśniejszym na podstawie poniższego przykładu

  1. fopen (): jest wywołaniem biblioteki,
  2. open (): jest wywołaniem systemowym.

Kiedykolwiek w programie c, używasz fopen () z pliku nagłówka. Środowisko programistyczne wywołuje wywołanie systemowe open () z jądra i wykonuje zadanie otwierania plików. Ponownie po wykonaniu kontrola przepływu powraca do trybu użytkownika.

Aby to zilustrować, wykonaj następujące czynności

  1. man man: tutaj znajdziesz sekcję instrukcji od 1 do 8, każda ma określony cel.
  2. Zrób man fopen: zobaczysz respose jako FOPEN(3), tutaj 3 wskazuję ręczną sekcję 3 stron podręcznika, która jest sekcją wywołań biblioteki c.
  3. Zrób man open: zobaczysz respose jako OPEN(2), tutaj 2 wskazuję ręczną sekcję 2 stron podręcznika, która jest sekcją wywołań systemowych.

    Mam nadzieję, że zrozumiałeś tę koncepcję.

alpha9eek
źródło
Jądro ma tylko jeden tryb, tryb jądra. Procesy użytkownika mają dwa tryby operacyjne, które przełączają tam iz powrotem, obszar użytkownika i jądro.
jlliagre
1

Po prostu dodając do różnic wymienionych tutaj w innych odpowiedziach.

Ponieważ wywołanie biblioteki jest po prostu wywołaniem funkcji, nie następuje przejście z przestrzeni użytkownika do przestrzeni jądra. Z drugiej strony wywołanie systemowe powoduje przejście z przestrzeni użytkownika do przestrzeni jądra, ponieważ wywołanie systemowe działa w trybie jądra.

cout_display_name
źródło