Załóżmy, że chcemy utrzymać pulę pamięci w sterowniku lub module urządzenia. W jaki sposób można utworzyć pulę i być dostępną dla wielu procesów, powiedzmy 4 procesy, uzyskując dostęp do tego sterownika/modułu.Pula pamięci w sterowniku jądra dla wielu procesów
Założono 1 MB pamięci w puli.
Kiedy czytałem LDD natknąłem się na memove_create(), ale jest też kmalloc.
Jeśli ktoś zrobił coś takiego, podziel się tą wiedzą.
Moje początkowe podejście polega na alokowaniu za pomocą metody kmalloc(), a następnie utrzymywaniu wskaźników początkowych i końcowych w obiekcie prywatnym dla każdego procesu, który otwiera moduł.
EDYCJA: Dzięki @kikigood za poświęcenie czasu na to. Tak na podstawie twoich komentarzy, robię coś takiego.
Powiedzmy, że przydzieliłem 1 MB pamięci memo podczas init. I chcę ograniczyć liczbę procesów do 4, więc liczę. Przyrost ten licznik na każdym
atomic_t count =0;
open()
{
if(count >4)
return -ENOMEM;
count++;
}
Również zachować bufor w moim prywatnym konstrukcji urządzenia za proces.
Jak przypisać część pamięci z puli do tego bufora.
Jak zarządzać rozkładem pamięci między procesami za pomocą mempool_create() lub kmem_cache_create(). Te interfejsy API mogę używać podczas init() modułu ... co używać w open() dla każdego procesu. – RootPhoenix
Możesz zrobić kmem_cache_create() w module init i przekazać jego wartość zwracaną (uchwyt), aby otworzyć metodę.jak poniższy kod: int scull_open (inode struktury * i-węzeł, plik struct * filp) {filp-> private_data = dev;/* dla innych metod * /}. więc możesz po prostu przechowywać uchwyt w swojej strukturze dev. – kikigood
, ale jeśli pytasz, jak zaimplementować metodę sterownika urządzenia podczas obsługi przypadków, w których wiele procesów może uzyskać dostęp do tego samego urządzenia lub różnych urządzeń wirtualnych, jest to inna rzecz, która nie jest związana z korzystaniem z puli pamięci. – kikigood