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?
@ 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.
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.
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.
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.
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 ...
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ąć.Odpowiedzi:
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.
źródło
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>
iinclude/asm-<arch>
gdzie<arch>
jest określona nazwa architektury. W rzeczywistości jest to tylko niewielka część pełnego źródła jądra.źródło
Nie możesz tego zrobić w C :)
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.
źródło
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.
źródło