Przerwanie w obsłudze przerwania.

0

Nie wiedziałem do jakiego działu dać to dałem tutaj bo OSy są często pisane w C.

Sytuacja jest taka:
Brak strony w pamięci -> przerwanie -> kod obsługujący do przerwanie - > X

Czy możliwe jest, aby X = przerwanie? Tzn. czy w trakcie wykonywania po stronie kernela interrupt handlera możliwe jest kolejne przerwanie? Jeżeli odpowiedź jest to zależy, to od czego?

3

Jeśli w handlerze przerwania nie zostały one wyłączone (w przypadku x86 służy temu instrukcja cli), jest to sytuacja możliwa.
Dlatego też w handlerach przerwań powinno się je chwilowo wyłączać.

6

To zależy.

W ogólności możliwe jest przyjście kolejnego przerwania podczas wykonywania kodu przerwania. Żeby tego uniknąć często po prostu wyłącza się przerwania w funkcji obsługi przerwania. W takim wypadku przerwania będą obsługiwane jedno po drugim. Żeby poradzić sobie z taką sytuacją bez wyłączania przerwań, przerwaniom nadaje się priorytety (o ile jest to obsługiwane przez kontroler przerwań) i wykonuje się zagnieżdżanie przerwań. To znaczy, że podczas obsługi przerwania, inne przerwanie o wyższym priorytecie może zostać obsłużone, zanim obsługa poprzedniego przerwania zostanie zakończona.

Tu masz obrazek, który pokazuje o co chodzi:

user image
(sei to w AVR instrukcja włączająca przerwania)

Szczegóły zależą od konkretnego procesora (architektury).

0

Tutaj chyba chodzi o interrupty z kernela. Czyli kernelik sobie robi jakąś funkcję systemową i nagle bah, koniec pamięci. W C++, przy new, można złapać ten wyjątek, wspominał o tym nawet! Grębosz w swoim anty poradniku.
Dedukując, High level w kodzie new może złapać wyjątek braku pamięci.
Z tym że przynajmniej w linuxie ten wyjątek to nie wyjątek, ani żaden sygnał czy coś takiego. Linuxowy brk(),sbrk() zwyczajnie zwraca albo adres albo kod bledu ENOMEM. Więc jest to rozwiązane całkowicie inaczej.

O sygnałach, łapaniu ich i ogólnie o wysyłaniu ponownym lub ignorowaniu masz książeczkę "Programowanie w środowisku systemu Unix" - Stevensa. Tabeleczkę z jakimiś sygnałami masz na stronie 320-321, o ile będziesz miał to samo wydanie.

Tylko tak w sumie nie wiadomo o co Ci chodzi. Jak powiedzmy dzielenie przez zero, błąd sprzętowy czy inne (znajdziesz w książce), to wymagają one obsłużenia. W przeciwnym razie system (kernel), killuje proces i obsługuje przerwanie po swojemu. W przeciwnym razie proces udupił by kernela.

0

Z tego co pamiętam, to w x86 flaga przerwań jest automatyczni czyszczona, gdy przerwanie jest wywołane (INT), wiec dopóki przerwania nie zostaną przywrócone przerwanie nie może zostać przerwane.

0

A jakie to przerwanie wyrzuca, sprzęt na brak pamięci / brak strony ?

0

Page fault.

0
Świetny Mleczarz1 napisał(a):

Nie wiedziałem do jakiego działu dać to dałem tutaj bo OSy są często pisane w C.

Sytuacja jest taka:
Brak strony w pamięci -> przerwanie -> kod obsługujący do przerwanie - > X

Czy możliwe jest, aby X = przerwanie? Tzn. czy w trakcie wykonywania po stronie kernela interrupt handlera możliwe jest kolejne przerwanie? Jeżeli odpowiedź jest to zależy, to od czego?

To zależy co najmniej od architektury procesora i od zdarzenia, które nastąpi w chwili obsługi wyjątku braku strony.

Różne rodzaje wyjątków oddziałują w inny sposób na pozostałe.
Dla przykładu, w procesorach ARM, wyjątek braku strony (np. data abort) automatycznie (sprzętowo) zamaskuje przerwanie IRQ. Oznacza to, że na tym CPU, na którym wystąpił wyjątek braku strony nie zostanie przyjęte przerwanie IRQ do momentu aż go nie odmaskujemy lub nie opuścimy wyjątku (służy do tego specjalna instrukcja) przy założeniu, że wcześniej przerwanie IRQ było odmaskowane.
Natomiast data abort nie maskuje szybkich przerwań (FIQ) a więc jeśli takie przerwanie jest skonfigurowane w systemie to jak najbardziej może się w takiej sytuacji pojawić i "wywłaszczyć" procedurę obsługi braku strony (jednak zwykle FIQ nie jest włączony).
Ponadto, jeżeli w procedurze obsługi braku strony nastąpi kolejny błąd dostępu do strony (np. w wyniku jakiegoś błędu w designie) to nastąpi zagnieżdżony wyjątek itd.

TLDR: To zależy od architektury. Z reguły przerwania asynchroniczne, od urządzeń itp. są maskowane. Przerwania specjalne (jak FIQ na ARM) mogą nie być maskowane. Wyjątki takie jak zagnieżdżony page fault nie mogą być maskowane (nie miałoby to sensu).

W tym momencie nie przychodzą mi do głowy inne scenariusze chyba, że coś związane z RT. Mam nadzieję, że nic nie pomyliłem ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1