10

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.

Odpowiedz

4

Aby utworzyć pulę pamięci, trzeba użyć

  1. jądrze płyta podzielnik

    lub

  2. utrzymać pulę pamięci sam jak co zrobiłeś (kmalloc)

Korzystając z przydziału płyty, można użyć:

  1. kmem_cache_create()/kmem_cache_create().

lub

  1. mempool_create()

Myślę, że kluczowym problemem, aby utrzymać basen przez siebie ryzyko tworzenia pamięci fragmentacji numerze które szybko zabraknie pamięci lub nie można przydzielić dużego bloku pamięci, nawet jeśli jest dużo wolnej pamięci.

Inną korzyścią z używania przydziału tablicy na jądro jest to, że można łatwo monitorować wykorzystanie pamięci, patrząc na wpisy/proc/slab.

+0

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

+0

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

+0

, 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

Powiązane problemy