2011-07-13 9 views
6

Próbowałem przeczytać więcej o różnych bramach w architekturze x86. Jeśli rozumiem poprawnie, to przerwanie i pułapka są używane odpowiednio do obsługi przerwań hw i sw. Podczas gdy bramka CALL prawdopodobnie nie jest już używana, jako preferowane są osoby preferowane przez SYSENTER i SYSEXIT.bramka zadania, brama przerwań, bramka wywoławcza

Zastanawiam się, w jaki sposób używane są bramki zadań (wiem, że są używane do przełączania zadań hw). Co to dokładnie oznacza? Czy zadanie hw odnosi się do zadania/procesu systemu operacyjnego. Czy jest to raczej przełączanie między dwoma różnymi instancjami systemu operacyjnego. (Może być na serwerach.)?

Może się zdarzyć, że niektóre przerwań są obsługiwane w trybie użytkownika. (Możemy obsłużyć dzielenie przez zero przerwanie w trybie użytkownika. Jeśli może być następnie to znaczy IDT pozycję uchwytu dla dzielenia przez zero zawiera adres z przestrzeni użytkownika?)

Dzięki

Odpowiedz

7

Wszystko może chcesz wiedzieć o przerywaniu i bramkach jest w Intel developer manual, volume 3. W skrócie:

  • Bramy zadań zostały pierwotnie zaprojektowane jako proces przełączania zadań za pośrednictwem procesora; CPU może automatycznie rejestrować stan procesu podczas operacji przełączania zadań. Nie są one zwykle używane w nowoczesnych systemach operacyjnych; system operacyjny zwykle sam wykonuje operacje oszczędzające stan.
  • Przynajmniej w Linuksie, wszystkie procedury obsługi przerw znajdują się w przestrzeni jądra i wykonują w pierścieniu 0. Jeśli chcesz obsłużyć wyjątek dzielenia przez zero, rejestrujesz procedurę obsługi sygnału przestrzeni użytkownika dla SIGFPE; przerwań obsługi przestrzeni jądra podnosi sygnał SIGFPE, pośrednio wyzwalający kod obsługi przestrzeni użytkownika (kod obszaru użytkownika jest wykonywany po powrocie z obsługi przerwań).
+0

W pewnym sensie przeszedłem przez instrukcję, ale instrukcja oczywiście nie wspomina, że ​​gagi zadań nie są już używane we współczesnym systemie operacyjnym. W moim projekcie klasy nigdy nie użyłem bramy zadań i całkowicie ją zignorowałem. Byłem zdezorientowany, jeśli w nowoczesnych systemach operacyjnych jest jakikolwiek dostęp do bramek zadań. Tylko w celu potwierdzenia, czy przerwanie zegara jest odwzorowane na przerwanie bramki? –

+1

"Tabela deskryptorów przerwań (IDT) kojarzy każdy wyjątek lub wektor przerwań z deskryptorem bramki dla procedury lub zadania używanego do obsługi powiązanego wyjątku lub przerwania." więc tak, każde przerwanie jest odwzorowywane na bramkę przerwań. Zauważ, że podręcznik Intela nie omawia tego, co jest lub nie jest używane; opisuje tylko to, co _ może_ być użyte. – bdonlan

+1

Kilka systemów operacyjnych zostało zaprojektowanych do pracy na różnych architekturach, dlatego należy unikać używania niektórych funkcji specyficznych dla Intela. I, jak mówisz, niektóre funkcje są po prostu przestarzałe. –

4

Stan faktyczny polega na tym, że tylko bramki przerywające i pułapkowe były aktualnie w użyciu i pozostają w użyciu. Teoretycznie oba z nich mogą być używane zarówno dla s/w, jak i dla obsługi zdarzeń h/w. Jedyna różnica między nimi polega na tym, że wywołanie bramek przerywanych automatycznie zabrania przyszłych przerwań, które mogą być przydatne w niektórych przypadkach przerwań sprzętowych. Domyślnie ludzie próbują używać pułapek, ponieważ niepotrzebne wyłączanie przerwań jest złe, ponieważ przerywające przerywanie zwiększa opóźnienia obsługi przerwań i zwiększa prawdopodobieństwo przerwania przerwania. Brama połączeń nigdy nie była w użyciu. Jest to niewygodny i nieoptymalny sposób na wdrożenie wywołania systemowego. Zamiast wywoływania gate, większość systemów operacyjnych używa pułapek gate (int 0x80 w Linux i int 0x2E w Windows) lub sysenter/sysexit syscall/sysrt instructions. Brama zadań nigdy nie była w użyciu. Nie jest to optymalna, niewygodna i ograniczona funkcja, jeśli w ogóle nie jest brzydka. Zamiast tego, systemy operacyjne zwykle implementują przełączanie zadań po swojej stronie przez przełączanie stosów zadań trybu jądra. Początkowo Intel dostarczył sprzętową obsługę wielozadaniowości poprzez wprowadzenie TSS (segmentu stanu zadania) i bramy zadań. Zgodnie z tymi cechami, procesor jest w stanie automatycznie przechować stan jednego zadania i przywrócić stan innego w odpowiedzi na żądanie pochodzi od hw lub sw. Żądanie sw może zostać wykonane poprzez wydawanie instrukcji call lub jmp z selektorem TSS lub selektorem bramek zadania używanym jako operand instrukcji. Żądanie Hw może być wykonane przez wgranie sprzętowe do bramki zadań w odpowiednim wpisie IDT. Ale jak już wspomniałem, nikt tak naprawdę tego nie używa. Zamiast tego, systemy operacyjne używają tylko jednego TSS dla wszystkich zadań (TSS musi być używany w każdym przypadku, ponieważ podczas przenoszenia sterowania z mniej uprzywilejowanego segmentu do bardziej uprzywilejowanych stosów przełącznika CPU i przechwytuje adres stosu dla bardziej uprzywilejowanych segmentów od TSS) i ręcznego przełączania zadań.

Teoretycznie przerywanie i wyjątki mogą być obsługiwane w trybie użytkownika (pierścień 3), ale w praktyce nie jest to użyteczne, a system operacyjny obsługuje wszystkie takie zdarzenia po stronie jądra (w pierścieniu 0). Powód jest prosty, procedury obsługi przerwań i wyjątków muszą zawsze znajdować się w pamięci i być dostępne z dowolnej przestrzeni adresowej. Część przestrzeni adresowej jądra jest wspólna i taka sama we wszystkich przestrzeniach adresowych wszystkich zadań w systemie, ale część przestrzeni adresowej użytkownika jest połączona z konkretnym zadaniem. Jeśli chcesz obsłużyć wyjątek w trybie użytkownika, będziesz zmuszony przeprogramować IDT na każdym przełączniku zadań, który wprowadzi znaczną obniżkę wydajności. Jeśli chcesz obsługiwać przerwań w ten sam sposób, będziesz zmuszony do dzielenia się procedurami obsługi przerwań między wszystkimi zadaniami na tych samych adresach. Jako niechcianą konsekwencję każde zadanie w systemie będzie mogło uszkodzić program obsługi.

Powiązane problemy