Różnica między Bramą wywołania, bramą przerwania, bramą pułapki?

Studiuję tryb ochrony Intela. Odkryłem, że Wrota wywołania, Wrota przerwania, Wrota pułapki są prawie takie same. W rzeczywistości, poza tym, że bramka wywołania ma pola do licznika parametrów, a te 3 bramki mają pola innego typu, są identyczne we wszystkich innych polach.

Jeśli chodzi o ich funkcje, wszystkie są używane do przeniesienia kontroli kodu do jakiejś procedury w obrębie jakiegoś segmentu kodu.

Zastanawiam się, ponieważ te 3 bramki zawierają informacje potrzebne do połączenia poza granicami przywilejów. Po co nam 3 rodzaje? Czy 1 nie wystarczy?

Dzięki za czas i odpowiedź.

Update 1

Powiązane pytanie: Kiedy używać bramy przerwania lub bramy pułapki?

Update 2

Dzisiaj wpadłem na taką myśl:

Różne przeznaczenie, różne bramki i różne szczegóły zachowania procesora. Takie jak obsługa flagi.

Author: Community, 2010-08-06

3 answers

Bramka (wywołanie, przerwanie, zadanie lub pułapka)jest używana do przesyłania kontroli nad wykonaniem między segmentami. Sprawdzanie poziomu uprawnień odbywa się różnie w zależności od rodzaju przeznaczenia i użytej instrukcji.

Brama wywołania używa instrukcji CALL i JMP. Bramy wywołania przenoszą kontrolę z niższego kodu uprawnień do wyższego kodu uprawnień. Bramka DPL służy do określenia, jakie poziomy uprawnień mają dostęp do bramy. Bramy wywołania są (lub były, prawdopodobnie) stopniowo porzucane na rzecz mechanizmu SYSENTER/sysexit, który jest szybszy.

Bramki Zadań służą do sprzętowej obsługi wielozadaniowości. Sprzętowy przełącznik zadań może wystąpić dobrowolnie (wywołanie/JMP do deskryptora bramki zadań) lub poprzez przerwanie lub IRET, gdy ustawiony jest znacznik NT. Działa to w ten sam sposób z bramkami przerwań lub pułapek. Bramy zadań nie są używane, z tego co wiem, ponieważ jądra zwykle wymagają dodatkowej pracy podczas przełączania zadań.

Bramy przerwań i pułapek, wraz z bramkami zadań, są znane jako tablica deskryptorów przerwań. Działają one tak samo jak bramki wywołania, z wyjątkiem transferu parametrów, z jednego stosu uprawnień do drugiego. Jedną z różnic jest to, że bramki przerwań czyszczą bit IF W EFLAGS, podczas gdy bramki pułapek nie. Dzięki temu idealnie nadają się do serwowania przerwań sprzętowych. Pułapki są szeroko stosowane w wirtualizacji wspomaganej sprzętowo.

Aby uzyskać więcej informacji, zapoznaj się z podręcznikami architektury Intela dotyczącymi interesujących Cię procesorów.

Update

Aby odpowiedzieć na komentarz:

Istnieje wiele powodów, aby odróżnić przerwania od pułapek. Jedną z nich jest różnica w zakresie: bramki przerwań wskazują na przestrzeń jądra (w końcu to jądro zarządza sprzętem), podczas gdy pułapki są wywoływane w przestrzeni użytkownika. Programy obsługi przerwań są wywoływane w odpowiedzi na zdarzenia sprzętowe, podczas gdy pułapki są wykonywane w odpowiedzi na instrukcje procesora.

Dla prostego (ale niepraktycznego) przykładu, aby lepiej zrozumieć, dlaczego bramki przerwań i pułapek traktują EFLAGS inaczej, rozważ co by się stało, gdybyśmy pisali obsługę przerwań dla zdarzeń sprzętowych w systemie uniprocesorowym i nie mogliśmy wyczyścić bitu IF podczas jego serwowania. Byłoby możliwe, aby druga przerwa przybyła, gdy byliśmy zajęci obsługą pierwszego. Wtedy nasz program obsługi przerwań zostanie wywołany przez procesor w jakimś przypadkowym punkcie podczas wykonywania IH. Może to prowadzić do uszkodzenia danych, zablokowania lub innej złej magii. Praktycznie wyłączenie przerwania jest jednym z mechanizmów upewnij się, że seria instrukcji jądra jest traktowana jak sekcja krytyczna.

Powyższy przykład zakłada jednak maskowalne przerwania. I tak nie chcesz ignorować NMIs.

To w dużej mierze nieistotne również dzisiaj. Obecnie praktycznie nie ma rozróżnienia pomiędzy szybkimi i wolnymi programami obsługi przerwań (Szukaj "szybkich i wolnych programów obsługi"), programy obsługi przerwań mogą być uruchamiane w sposób zagnieżdżony, procesory SMP nakładają obowiązek łączenia lokalnego wyłączania przerwań z zamki obrotowe i tak dalej.

Teraz bramy pułapek są rzeczywiście używane do obsługi przerwań oprogramowania, WYJĄTKÓW itp. Błąd strony lub podział przez zerowy wyjątek w procesorze jest prawdopodobnie obsługiwany przez bramę pułapki. Najprostszym przykładem użycia bramek pułapek do sterowania wykonywaniem programu jest instrukcja INT 3, która służy do implementacji punktów przerwania w debuggerach. Podczas wirtualizacji zdarza się, że hypervisor działa w ringu 0, a jądro gościa zwykle w ringu 1 - Gdzie kod uprzywilejowany zawiedzie z ogólnym wyjątkiem. Witchel i Rosenblum opracowali tłumaczenie binarne, które jest w zasadzie przepisywaniem instrukcji, aby symulować ich efekty. Krytyczne instrukcje są odkrywane i zastępowane pułapkami. Następnie, gdy pułapka zostanie uruchomiona, sterowanie jest przekazywane do VMM / hypervisor, który jest odpowiedzialny za emulację krytycznych instrukcji w pierścieniu 0.

Z wirtualizacją wspomaganą sprzętowo, technika trap-and-emulate została nieco ograniczony w użyciu (ponieważ jest dość drogi, zwłaszcza gdy jest dynamiczny), ale praktyka tłumaczenia binarnego jest wciąż szeroko stosowana .

Aby uzyskać więcej informacji, proponuję sprawdzić:

  • Linux Device Drivers, Third Edition (available online)
  • dla tłumaczenia binarnego, QEMU jest doskonałym początkiem.
  • jeśli chodzi o pułapkę i emulację, sprawdź porównanie pomiędzy oprogramowaniem/sprzętem techniki.

Mam nadzieję, że to pomoże!

 53
Author: Michael Foukarakis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-07 07:16:54

Architektura i projektowanie

Z punktu widzenia ochrony, Architektura x86 opiera się na hierarchicznych pierścieniach, zgodnie z którymi cała przestrzeń wykonania dostarczana przez procesor jest podzielona na cztery hierarchiczne domeny ochrony , z których każda ma przypisany własny poziom uprawnień. Ten projekt zakłada, że większość kodu czasowego będzie wykonywana w najmniej uprzywilejowanej domenie, a czasami wymagane będą usługi z bardziej uprzywilejowanej domeny bezpieczeństwa i te usługi uprzedzą mniej uprzywilejowane działania na stosie, a następnie przywrócą je w taki sposób, że całe uprzedzenie będzie niewidoczne dla mniej uprzywilejowanego kodu.

Konstrukcja hierarchicznych domen ochrony stwierdza, że kontrola nie może być przekazywana dowolnie pomiędzy różnymi domenami bezpieczeństwa.

Brama jest cechą architektury x86 do przenoszenia sterowania z mniej uprzywilejowanych segmentów kodu do bardziej uprzywilejowanych, ale nie odwrotnie. Ponadto punkt w mniej uprzywilejowanym segmencie, z którego zostanie przekazana kontrola, może być dowolny, ale punkt w segmencie bardziej uprzywilejowanym do którego zostanie przekazana kontrola jest ściśle określony. Sterowanie wstecz przechodzenie do mniej uprzywilejowanego segmentu jest dozwolone tylko za pomocą instrukcji IRET. W odniesieniu do instrukcji programisty Intel twierdzi:

Moduły kodu w niższych segmentach uprawnień mogą uzyskać dostęp tylko do modułów działających w wyższych segmentach uprawnień za pomocą ściśle kontrolowany i chroniony interfejs zwany Bramą. Próby uzyskania dostępu do segmentów wyższych uprawnień bez przechodzenia przez bramę ochrony i bez posiadania wystarczających praw dostępu powodują wygenerowanie wyjątku ochrony ogólnej (#GP).

Innymi słowy, brama jest punktem wejścia w domenie uprzywilejowanej z wymaganymi prawami dostępu i adresem docelowym. W ten sposób wszystkie bramki są podobne i wykorzystywane do niemal tych samych celów, a wszystkie deskryptory bramek zawierają pole DPL, które jest używane przez procesor do kontroli praw dostępu. Ale zauważ, że procesor sprawdza DPL bramki tylko wtedy, gdy źródłem połączenia było oprogramowanie CALL, JMP, lub INT instrukcji i omija tę kontrolę, gdy źródłem wywołania jest sprzęt.

Rodzaje bram

Pomimo faktu, że wszystkie bramki są podobne, mają pewne różnice, ponieważ pierwotnie inżynierowie Intela myśleli, że różne bramki będą używane do różnych celów.

Task Gate

Zadanie Brama może być przechowywana tylko w IDT i GDT i wywoływana przez instrukcję INT. Jest to bardzo szczególny rodzaj bramy, która znacznie różni się od innych.

[23]} początkowo inżynierowie Intela myśleli, że zrewolucjonizują wielozadaniowość, zapewniając funkcję przełączania zadań opartą na procesorze. Wprowadzono TSS (Task State Segment), który przechowuje stan rejestrów zadania i może być używany do przełączania zadań sprzętowych. Istnieją dwa sposoby wyzwalania przełączania zadań sprzętowych: za pomocą samego TSS i za pomocą bramki Zadań. Aby dokonać sprzętowego przełączania zadań, możesz użyć instrukcji CALL lub JMP. Jeśli dobrze rozumiem, głównym powodem wprowadzenia bramki zadań była możliwość wyzwalania sprzętowych przełączników zadań w odpowiedzi na nadejście przerwania, ponieważ sprzętowy przełącznik zadań nie może być wyzwalany przez JMP do selektora TSS.

W rzeczywistości nikt nie używa go ani przełączania kontekstu sprzętowego. W praktyce funkcja ta nie jest optymalna z punktu widzenia wydajności i nie jest wygodny w użyciu. Na przykład, biorąc pod uwagę, że TSS może być przechowywany tylko w GDT i długość GDT nie może być większa niż 8192, nie możemy mieć więcej niż 8K zadań z punktu widzenia sprzętu.

Trap Gate

Brama pułapki może być przechowywana tylko w IDT i wywoływana przez instrukcję INT. Można go uznać za podstawowy typ bramy. Po prostu przekazuje kontrolę na konkretny adres podany w deskryptorze bramki trap w segmencie bardziej uprzywilejowanym i nic więcej. Bramy pułapkowe aktywnie wykorzystywane do różnych celów, które mogą obejmować:

    W związku z tym, że system nie jest w pełni funkcjonalny, nie jest w pełni funkcjonalny, nie jest w pełni funkcjonalny.]}
  • implementacja obsługi wyjątków(nie mamy powodu wyłączać przerwań w przypadku WYJĄTKÓW).
  • obsługa przerwań na maszynach z APIC (możemy lepiej kontrolować stos jądra).

Interrupt Gate

Brama przerwania może być przechowywany tylko w IDT i wywoływany przez instrukcję INT. Jest to to samo co Brama pułapki, ale dodatkowo wywołanie bramy przerwania dodatkowo uniemożliwia akceptację przyszłych przerwań poprzez automatyczne wyczyszczenie flagi IF w rejestrze EFLAGS.

Bramki przerwań używane aktywnie do obsługi przerwań, szczególnie na maszynach opartych na PIC. Powodem jest wymóg kontrolowania głębokości stosu. PIC nie posiada funkcji priorytetów źródeł przerwań. Z tego powodu domyślnie wyłącza PIC tylko przerwanie, które już na obsłudze w procesorze. Ale kolejne przerwania nadal mogą pojawić się w środku i uprzedzić obsługę przerwań. Tak więc na stosie jądra może być 15 programów obsługi przerwań w tym samym momencie. W rezultacie deweloperzy kernela zmuszeni byli albo znacznie zwiększyć rozmiar stosu jądra, co prowadzi do kary za pamięć, albo byli gotowi stawić czoła sporadycznemu przepełnieniu stosu jądra. Brama przerwań może dać gwarancję, że na stosie jądra może znajdować się tylko jedna obsługa w o tej samej porze.

Call Gate

Brama wywołania może być przechowywana w GDL i LDT i wywoływana przez CALL i JMP Instrukcje. Podobny do trap gate, ale dodatkowo może przekazać wiele parametrów ze stosu zadań trybu użytkownika do stosu zadań trybu jądra. Ilość przekazywanych parametrów jest określona w deskryptorze bramki wywołania.

Bramy połączeń nigdy nie były popularne. Jest ku temu kilka powodów:

    Można je zastąpić bramkami pułapek (brzytwą Occama).
  • oni nie dużo przenośny. Inne procesory nie mają takich funkcji, co oznacza, że obsługa bramek wywołań systemowych jest obciążeniem przy przenoszeniu systemu operacyjnego, ponieważ te połączenia muszą zostać przepisane.
  • nie są zbyt elastyczne, ponieważ ilość parametrów, które mogą być przekazywane między stosami, jest ograniczona.
  • Nie są optymalne z punktu widzenia wydajności.

Pod koniec lat 90. Intel i AMD wprowadziły dodatkowe instrukcje dla wywołań systemowych: SYSENTER/SYSEXIT (Intel) oraz SYSCALL/SYSRET (AMD). W przeciwieństwie do bramek połączeń, nowe instrukcje zapewniają korzyści wydajności i znalazły zastosowanie.

Podsumowanie

Nie zgadzam się z Michaelem Foukarakisem. Przepraszamy, ale nie ma żadnych różnic między przerwaniami i pułapkami poza wpływającymi na flagę IF.
  • Teoretycznie każdy typ bramy może służyć jako interfejs wskazujący na segment o dowolnym poziomie uprawnień. W praktyce, w nowoczesnym systemie operacyjnym w używaj tylko bramek przerwań i pułapek, które są używane w IDT do wywołań systemowych, przerwań i obsługi wyjątków i z tego powodu służą one jako punkt wejścia do jądra.

  • Każdy typ bramki (w tym przerwanie, pułapka i zadanie) może być wywołany w oprogramowaniu za pomocą instrukcji INT. Jedyną funkcją, która może zabronić Użytkownikowi dostępu do danej bramki jest DPL. Na przykład, gdy system operacyjny buduje IDT, niezależnie od typów poszczególnych bramek, konfiguracja jądra DPL bramy, które będą używane do obsługi zdarzeń sprzętowych, zostaną ustawione na 0 i zgodnie z tym dostęp do tych bramek będzie dozwolony tylko z przestrzeni jądra (która działa co najwyżej w domenie uprzywilejowanej), ale kiedy ustawia bramę dla wywołania systemowego, ustawia DPL na 3, aby umożliwić dostęp do tej bramy z dowolnego kodu. W rezultacie, zadanie trybu użytkownika jest w stanie wykonać wywołanie systemowe przy użyciu bramki z DPL = 3, ale wyłapie ogólny błąd ochrony przy próbie wywołania funkcji obsługi przerwań klawiatury, na przykład.

  • Dowolne typ bramy w IDT może być wywołany przez sprzęt. Ludzie używają bram przerwań do obsługi zdarzeń sprzętowych tylko w przypadkach, gdy chcą uzyskać pewną synchronizację. Na przykład, aby upewnić się, że przepełnienie stosu jądra jest niemożliwe. Na przykład, mam udane doświadczenie z wykorzystaniem bram pułapek do obsługi przerwań sprzętowych w systemie opartym na APIC.

  • W podobny sposób Brama dowolnego typu w IDT może być wywoływana w oprogramowaniu. Powodem użycia bramek pułapkowych do wywołania systemowego a wyjątki są proste. Brak powodów do wyłączenia przerwań. Wyłączenie przerwania jest złe, ponieważ zwiększa obsługę opóźnień i zwiększa prawdopodobieństwo utraty przerwania. Dzięki temu nikt ich nie wyłączy bez żadnego poważnego powodu na rękach.

  • Obsługa przerwań zazwyczaj pisana jest w ścisłym stylu reentrantowym. W ten sposób programy obsługi przerwań zwykle nie udostępniają żadnych danych i mogą w przejrzysty sposób wyprzedzać się nawzajem. Nawet wtedy, gdy musimy wzajemnie wykluczać współbieżny dostęp do danych w programie obsługi przerwań możemy chronić tylko dostęp do współdzielonych danych za pomocą instrukcji cli i STI. Nie ma powodu, by uważać cały program obsługi przerwań za sekcję krytyczną. Nie ma powodu, aby używać bram przerwań, z wyjątkiem chęci zapobieżenia ewentualnemu przepełnieniu stosu jądra w systemach opartych na PIC.

Bramki pułapek są domyślnym rozwiązaniem dla interfejsu jądra. Brama przerwań może być używana zamiast bramy pułapki, jeśli istnieje poważny powód za to.

 15
Author: ZarathustrA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-23 02:58:10

Brama przerwań jest wyjątkowa, ponieważ flaga IF jest automatycznie czyszczona. Brama wywołania jest wyjątkowa, ponieważ nie jest aktywowana przez wektor przerwania. Brama zadań jest wyjątkowa, ponieważ automatycznie zapisuje stan procesora. Cztery różne zachowania, posiadanie czterech nazw dla nich jest wygodne.

 8
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-06 17:23:59