2015-04-13 16 views
5

Czy istnieje prosty mechanizm do wskazania, czy dana funkcja jest wywoływana w kontekście przerwań, czy z kontekstu procesu. To pierwsza część pytania. Druga część to: Jak zsynchronizować 2 procesy, jeden w kontekście przerwań i drugi, który jest w kontekście procesu. Jeśli moje zrozumienie jest właściwe, nie możemy używać muteksów dla procesu w kontekście przerwań, ponieważ nie wolno im spać. Z drugiej strony, jeśli użyję spinlocków, drugi proces użyje cykli procesora. Jaki jest najlepszy sposób synchronizacji tych 2 procesów. Popraw mnie, jeśli moje zrozumienie jest całkowicie błędne.Który kontekst danej funkcji jest wywoływany w jądrze Linuksa

Odpowiedz

4

Można sprawdzić, czy funkcja została uruchomiona jako przerywacz IRQ przy użyciu funkcji in_irq(). Ale nie sądzę, że dobrą praktyką jest jej używanie. Powinieneś zobaczyć właśnie z kodu, w którym kontekście uruchamiana jest twoja funkcja. W przeciwnym razie powiedziałbym, że twój kod ma zły design.

Jeśli chodzi o mechanizm synchronizacji - masz rację, musisz użyć spinlock, ponieważ musisz wykonać synchronizację w kontekście atomowym (na przykład przerwanie) - nie, że masz tu duży wybór. Masz również rację, że wiele cykli CPU zostanie zmarnowanych podczas oczekiwania na blokadę spinlock, więc powinieneś spróbować zminimalizować ilość kodu pod blokadą.

0

Dodając do odpowiedzi Sama - powinieneś zaprojektować swój przerywnik z sekcjami dolną i górną połówką. Pozwala to na uzyskanie minimalnego kodu (górna połowa) w procedurze obsługi przerwań (rejestrowanej podczas żądania IRQ w sterowniku) i odpoczynku (dolna połowa), którą można zaplanować przy użyciu kolejki roboczej. Możesz mieć tę górną połowę (gdzie właśnie przetwarzasz przerwanie i robisz jakieś minimalne czerwone/zapisy z urządzenia) wewnątrz atomowego kontekstu chronionego przez spinlock, tak że mniejsza liczba cykli procesora jest zmarnowana czekając na spinlock.

Powiązane problemy