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
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ą.
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.
- 1. Wywołanie funkcji w jądrze Linuksa
- 2. Jak spać w jądrze Linuksa?
- 3. hrtimer powtarzające się zadanie w jądrze Linuksa
- 4. Uzyskiwanie listy urządzeń sieciowych w jądrze Linuksa
- 5. główna obsługa błędów strony w jądrze Linuksa
- 6. Mierzenie czasu w jądrze Linuksa 2.6
- 7. Który konstruktor jest tutaj wywoływany?
- 8. Przejście z trybu rzeczywistego do chronionego w jądrze Linuksa
- 9. Implementacja poprawnej synchronizacji między modułami w jądrze Linuksa
- 10. Jak odczytać sektor za pomocą żądania biologicznego w jądrze Linuksa
- 11. Limit linii Shebang w bashu i jądrze Linuksa
- 12. Implementacja wywołań systemowych/pułapek w jądrze Linuksa źródło
- 13. Używanie podwójnego wskaźnika w jądrze Linuksa Implementacja listy skrótów
- 14. Jak odczytać sektor za pomocą żądania bio w jądrze Linuksa
- 15. Jaki jest kontekst funkcji w tablicy?
- 16. Vuejs dostaje element, który jest wywoływany przez zdarzenie?
- 17. Co to są przestawienia przerwań (RES)? Co to powoduje? Jak jest obsługiwany w jądrze Linuksa?
- 18. Kiedy wywoływany jest Angular2 ngAfterViewInit?
- 19. Czy istnieje punkt rozszerzenia WCF, który jest wywoływany przed UserNamePasswordValidator?
- 20. Jaki jest pożytek z __kwdefaults__, który jest atrybutem funkcji funkcji?
- 21. OnBackPressed nie jest wywoływany?
- 22. Adres w jądrze
- 23. getChildView nie jest wywoływany
- 24. Kiedy wywoływany jest Constructor?
- 25. IntentService nie jest wywoływany
- 26. Dlaczego destruktor nie jest wywoływany dla zwróconego obiektu z funkcji?
- 27. PHP Argumenty funkcji: Array obiektów danej klasy
- 28. Dlaczego jądro Linuksa # definiuje symbol jako taki?
- 29. Co to jest kontekst?
- 30. void Start() nie jest wywoływany