Dzięki za odpowiedź,
tak, to jest jądro 2.0 (ew. może czasami może być mowa o 2.1), OK, rozumiem, analizowałem to chwilę i pojawiły mi się następujące wątpliwości (podaję, ponieważ może przyda się to komu innemu, chcącemu zrozumieć mechanizm pracy schedulera):
Czy schedule() jest funkcją działającą w trybie jądra?
Czy do_bottom_half() jest funkcją działającą w trybie jądra?
Na górze strony, do której podałem link czytamy:
[quote]do_bottom_half() runs at normal kernel priority: all interrupts
- enabled. do_bottom_half() is atomic with respect to itself: a
- bottom_half handler need not be re-entrant.[/quote]
Nie wiem, czy atomiczność jest dokładnie tym samym, co działanie w trybie jądra, ale OK, rozumiem, że w trakcie wykonywania dolnych połówek inne procedury obsługi przerwań nie mogą być wywołane. Jednakże wyobrażam sobie następującą sytuację: wykonywanie funkcji do_bottom_half jest już zakończone, ale intr_count=0 nie zostało jeszcze wykonane, zostaje zgłoszone nowe przerwanie i licznik intr_count zostaje zwiększone do 1. Następnie wykonywane jest intr_count=0 i licznik aktywnych dolnych połówek zostaje błędnie zmniejszony do zera... STOP. intr_count nie jest licznikiem aktywnych dolnych połówek, tylko AKTUALNIE URUCHOMIONYCH procedur obsługi przerwań.
Swoją drogą w tym kontekście interesujące jest, jak owa tomiczność jest realizowana (cytat z książki Becka i in., s. 207):
quote Części te mają właśność atomiczności, to znaczy, tak długo jak dolna część jest aktywna, nie można wykonywać żadnej z pozostałych, więc nie jest konieczne używanie cli() w celu zabezpieczenia ich przed przerwaniami.[/quote]
Czy zatem funkcja do_bottom_half() wywołuje cli()? Oczywiście tutaj może pomóc analiza kodu źródłowego do_bottom_half().
Jeszcze raz dzięki za odpowiedź :).