2012-07-25 9 views
5

Piszę sterownik urządzenia, który, między innymi, przydziela blok pamięci z kmalloc. Ta pamięć jest zwalniana, gdy program użytkownika zamyka plik. W jednym z moich eksperymentów program użytkownika uległ awarii bez zamykania pliku.jest pamięć przydzielona przez kmalloc() kiedykolwiek automatycznie zwolniony?

Czy coś uwolniło tę pamięć?

W innym eksperymencie przeniosłem funkcję kfree() z funkcji close() do funkcji module_exit(). Gdy dwukrotnie uruchamiałem program użytkownika, ponownie zadzwoniłem pod numer kmalloc z tym samym wskaźnikiem, co wcześniej, bez uprzedniego zwalniania go. Tak więc straciłem wskaźnik do tej pamięci i nie mogę go uwolnić.

Czy pamięć została utracona w systemie do czasu ponownego uruchomienia, czy też zostanie zwolniona po wyładowaniu sterownika?

+2

Prawdopodobnie nastąpi ponowne uruchomienie komputera. Wyobrażam sobie, że jądro nie będzie magicznie uwalniać utraconej pamięci. Właściwym sposobem na zrobienie tego byłoby zamknięcie wyjścia programu i wolnych zasobów. W tym samym czasie deskryptory plików programu zostaną wyczyszczone. – Wug

Odpowiedz

8

Pamięć jądra nigdy nie jest automatycznie zwalniana. Obejmuje to kmalloc.

Cała pamięć związana z otwartym deskryptorem pliku powinna zostać zwolniona po zamknięciu pliku.
Po zakończeniu procesu z dowolnego powodu (łącznie z kill -9) wszystkie otwarte deskryptory plików są zamykane, a funkcja zamykania sterownika jest wywoływana. Jeśli więc uwolnisz się, nic, co proces ten nie może zrobić, sprawi, że pamięć pozostanie po tym, jak proces umiera.

3

Proszę nie odsyłać swojej przestrzeni użytkownika do programowania Kernela.

Co mam przez to na myśli?

Normalne procesy kończą się czyszczeniem po ich wyjściu, tak nie jest w przypadku modułów jądra, ponieważ tak naprawdę nie są one procesami.

Technicznie, po załadowaniu modułu, a następnie wywołaniu kmalloc, zadanie polegało na tym, że poprosiłeś jądro, aby przydzielił trochę pamięci dla ciebie w przestrzeni jądra, to technicznie nowa pamięć dla całego jądra, więc nawet jeśli rozładujesz twój moduł, który przydzielił pamięć jądra, chyba że został wyraźnie zwolniony.

W prostych słowach odpowiadając na pytanie: Każdy kmalloc potrzebuje kfree, inaczej pamięć pozostanie tam tak długo, jak system będzie gotowy.

Powiązane problemy