Wiem, że po skompilowaniu kodu źródłowego, powiedzmy C ++, wyjściem kompilatora jest kod maszynowy (wykonywalny), który moim zdaniem był instrukcją bezpośrednio do procesora. Ostatnio czytałem o jądrach i dowiedziałem się, że programy nie mogą uzyskać bezpośredniego dostępu do sprzętu, ale muszą przejść przez jądro.
Kiedy więc skompilujemy jakiś prosty kod źródłowy, powiedzmy za pomocą tylko jednej printf()
funkcji, a kompilacja wygeneruje wykonywalny kod maszynowy, czy każda instrukcja w tym kodzie maszynowym zostanie wykonana bezpośrednio z pamięci (po załadowaniu kodu do pamięci przez system operacyjny) lub każde polecenie w kodzie maszynowym musi jeszcze przejść przez system operacyjny (jądro), aby zostać wykonane?
Przeczytałem podobne pytanie . Nie wyjaśnił, czy kod maszynowy generowany po kompilacji jest instrukcją bezpośrednio do procesora, czy też będzie musiał ponownie przejść przez jądro, aby utworzyć poprawną instrukcję dla procesora. To znaczy, co dzieje się po załadowaniu kodu maszynowego do pamięci? Czy przejdzie przez jądro, czy bezpośrednio porozmawia z procesorem?
printf
nie jest świetnym przykładem. Jest to wyraźnie zdefiniowane przez specyfikację C jako funkcja, która jest dostępna tylko w implementacjach „hostowanych” (co oznacza, że działa na jądrze, w przeciwieństwie do „wolnostojącego”, który może go nie wymagać). I na większości platform, printf
jest to po prostu funkcja zapewniana przez twoją, libc
która robi wiele rzeczy w twoim imieniu (która ostatecznie obejmuje połączenie systemowe do wydrukowania na standardowe wyjście). Naprawdę nie różni się niczym od dzwonienia libvlc_media_list_add_media
lub PyObject_GetAttr
, z tym wyjątkiem, że pewna printf
implementacja jest gwarantowana do połączenia bez dodawania dodatkowych niestandardowych -l
.