Dlaczego obsługa niektórych zdarzeń systemów operacyjnych jest zapisywana w asm zamiast w c?

17

Moje pytanie brzmi: dlaczego obecnie niektóre zdarzenia systemu operacyjnego są nadal pisane w języku asemblera zamiast w języku wyższego poziomu, takim jak C, skoro samo jądro jest napisane głównie w C?

MAKZ
źródło
5
„Głównie w c” - i zgadnij, co reszta? ;)
goldilocks
@ Goldilocks dobrze jest w montażu. Ale dlaczego, podczas gdy inne części są w c?
MAKZ
4
Nie jestem w tym ekspertem, ale jest kilka rzeczy związanych ze sprzętem niskiego poziomu, których nie można zrobić w C; są one zazwyczaj specyficzne dla architektury. „Wbudowany ASM” jest często używany w tym celu w kodzie C, więc np. foobar()Zostanie zdefiniowany przy użyciu wbudowanego zestawu, jeden sposób na jednej platformie, a drugi na innym. Ogranicza to użycie asm do minimum, ale nie można go całkowicie uniknąć.
goldilocks
Jak ustawić rejestr wskaźnika globalnej tabeli deskryptorów w C?
user253751,

Odpowiedzi:

24

Język abstrakcji dostępu do rejestrów procesora, a system operacyjny podczas obsługi zdarzeń musi zapisać kontekst, więc potrzebuje dostępu do rejestrów w punkcie zdarzenia, tym samym psując specyfikację C.

WrinkleFree
źródło
To jest właściwie główny powód. Niektóre wbudowane kompilatory C mają rozszerzenia, które pozwalają im adresować rejestry (zwykle za pomocą wcześniej zadeklarowanych globalnych stałych / zmiennych). Mogą to zrobić, ponieważ są ukierunkowane tylko na jedną architekturę. Ale kompilatory C ogólnego przeznaczenia są ukierunkowane na zbyt wiele różnych architektur, aby takie rozszerzenia były rozsądne. W związku z tym zwykle po prostu wdrażają mechanizm osadzania
asmów
18

C jest abstrakcją kodu maszynowego działającego na maszynie (choć znacznie bliżej niż większość innych języków).

Do tych rzeczy używane są instrukcje kodu maszynowego, których nie można wyrazić w języku C, a być może w celu dodatkowej optymalizacji nie zapewnionej przez kompilator języka C używany jest zespół, głównie w postaci asemblera wbudowanego .

W drzewie kodu źródłowego jądra jest ono przechowywane pod arch/<arch>i include/asm-<arch>gdzie <arch>jest określona nazwa architektury. W rzeczywistości jest to tylko niewielka część pełnego źródła jądra.

ktoś
źródło
6

Nie możesz tego zrobić w C :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

Próbuję przejść do trybu chronionego x86. Oczywiście nadal mogę to zrobić w C, „emitując” surowe kody maszynowe, ale nadal w przypadku, gdy potrzebuję dostępu do precyzyjnych biur - głównie nie mam szczęścia.

Drugi przykład to BootLoader. W systemach x86 wymagane jest, aby tradycyjny kod rozruchowy miał dokładnie 512 bajtów, a ostatnie dwa bajty to odpowiednio 0xAA i 0x55 (lub dokładnie 55 AA) ... Zapewnienie, że kompilatory C są koszmarem, a asembler robi praca w fantastyczny sposób.

Istnieje wiele innych takich przypadków, w których Zgromadzenie jest nie tylko preferowane - ale jest jedynym środkiem.

Krishna S Santosh
źródło
-5

asm jest szczuplejszy i generalnie dużo szybszy niż C zatłoczony bibliotekami itp., a system operacyjny obsługuje DUŻO zdarzeń. Chcesz smukłej i szybkiej funkcji.

Escoce
źródło
2
Optymalizacja technologii kompilatora C stała się całkiem dobra. To mit, że asm byłby generalnie dużo szybszy niż C. W każdym razie nie jest to powód, dla którego operacje systemu operacyjnego na niskim poziomie używają asm. Ma przede wszystkim do czynienia z operacjami, które nie mogą być wyrażone w C jak bariera pamięci i zarejestrować tańce dla non-C konwencji zawijających, etc ...
Celada