2017-08-31 88 views
5

Założono, że na płycie głównej Intel x86-64 znajdują się 2 moduły DIMM. Wszystkie przeplatanie pamięci (bank i kanał) jest wyłączone.Bezpośrednie mapowanie pamięci na moduł DIMM

Próbuję zarezerwować fizyczną przestrzeń pamięci jednego z tych modułów DIMM z poziomu Linux kernel (wersja 4.11.11) i odsłonić fizyczną (zarezerwowaną) przestrzeń pamięci dla aplikacji. Moduły DIMM zostaną przeniesione do kanałów pamięci w postaci , a nie. Jak miałbym to zrobić? Jaki byłby ten proces? Jestem nowy w rozwoju jądra i mogę korzystać z pomocy.

co znalazłem do tej pory:

  1. Aby zarezerwować pamięć z jądra Linux można określić parametr memmap=nn[KMG]$ss[KMG] rozruchowego. Ten parametr oznacza określoną pamięć jako zarezerwowany region pamięci od ss do ss + nn.

  2. mmap może być używany do rozpoczęcia odwzorowania pomiędzy przestrzeni adresowej procesu na adres pa do len bajtów z pamięci dla obiektu przedstawionego deskryptora Fildes przy przesunięciu się dla len bajtów.

Po pamięci jest zarezerwowana, jestem przy założeniu, że niektórzy kierowcy urządzenie znakowe jest potrzebne, aby odsłonić zarezerwowaną pamięć do aplikacji przestrzeni użytkownika? Myśli?


Aktualizacja

Należy również zauważyć, że DIMM, który musi być zarezerwowana będzie w jego własnym dedykowanym kanale pamięci i żaden bank lub przeplatanie kanału zostanie włączona.

+0

Nie widzę, jak część DIMM pasuje do całego obrazu. W każdym razie, czy nie byłoby coś takiego jak '/ dev/mem'? Nie wiem, czy zarezerwowana pamięć zostanie zmapowana przez takie urządzenie. –

+0

@MargaretBloom Co jest niejasnego w DIMM? Próbuję zarezerwować całą pamięć jednego z modułów DIMM z użycia przez jądro. Czy to jasne? '/ dev/mem' reprezentuje całą pamięć dostępną do wykorzystania przez jądro, a zatem niekoniecznie jest reprezentatywne dla tego, czego potrzebuję. – Jonathan

+0

Można go odsłonić przez nową flagę dla 'mmap', tj. Zdefiniować' MAP_RESERVED_DIMM', jeśli w argumencie flagowym są jakieś nieużywane bity. HugeTLBFS to kolejny model: specjalny system plików, w którym można mapować pliki, aby uzyskać odwzorowania z czymś specjalnym na temat pamięci wewnętrznej. Nie jestem ekspertem od systemów wewnętrznych Linux (tylko zainteresowany amator), ale twój pomysł na urządzenie char lub blok też może działać. Zwłaszcza, jeśli planujesz mieć tylko jeden proces w przestrzeni użytkownika na raz, w przeciwnym razie, w jaki sposób pozwalasz im określić, które części są już zmapowane? –

Odpowiedz

0

Mapowanie /dev/mem to prosty sposób. Zrobiłem to już wcześniej. mmap wdrożyć od kernel source:

static int mmap_mem(struct file *file, struct vm_area_struct *vma) 
{ 
    size_t size = vma->vm_end - vma->vm_start; 
    phys_addr_t offset = (phys_addr_t)vma->vm_pgoff << PAGE_SHIFT; 

    /* It's illegal to wrap around the end of the physical address space. */ 
    if (offset + (phys_addr_t)size - 1 < offset) 
     return -EINVAL; 

    if (!valid_mmap_phys_addr_range(vma->vm_pgoff, size)) 
     return -EINVAL; 

    if (!private_mapping_ok(vma)) 
     return -ENOSYS; 

    if (!range_is_allowed(vma->vm_pgoff, size)) 
     return -EPERM; 

    if (!phys_mem_access_prot_allowed(file, vma->vm_pgoff, size, 
         &vma->vm_page_prot)) 
     return -EINVAL; 

    vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff, 
         size, 
         vma->vm_page_prot); 

    vma->vm_ops = &mmap_mem_ops; 

    /* Remap-pfn-range will mark the range VM_IO */ 
    if (remap_pfn_range(vma, 
       vma->vm_start, 
       vma->vm_pgoff, 
       size, 
       vma->vm_page_prot)) { 
     return -EAGAIN; 
    } 
    return 0; 
} 

Jedyną rzeczą, być może trzeba zmodyfikować to valid_mmap_phys_addr_range(vma->vm_pgoff, size). Lub możesz napisać własną wersję sterownika /dev/mem.

+0

Ale to nie ** przydziela/rezerwuje ** tych obszarów pamięci fizycznej, aby nie były wykorzystywane do niczego innego, prawda? Jakie są implikacje związane z mapowaniem jako "VM_IO", jak wskazuje ten komentarz? mmap (/ dev/mem) może być użyteczną częścią kompletnej odpowiedzi, ale nie sądziłem, że ta część jest trudna. –

+0

Użyj 'mem = xx' cmdline, aby jądro używało tylko części pamięci. Na przykład przekazanie 'mem = 4G' sprawi, że jądro będzie używać pamięci poniżej 4G, wtedy możesz użyć zmodyfikowanego sterownika'/dev/mem' do pamięci mmap powyżej 4G. –

+0

To interesujący pomysł i powinien działać w konfiguracji OP bez przeplatania. Czy jesteś pewien, że '/ dev/mem' nadal ma dostęp do pamięci poza zakresem, który według reszty jądra istnieje? –