2017-08-31 74 views
5

假設您將2個DIMM插入Intel x86-64主板。所有內存交錯(庫和通道)被禁用。直接內存映射到DIMM

我想要做的是從Linux kernel(版本號4.11.11)保留其中一個DIMM的物理內存空間,並公開該應用程序的物理(保留)內存空間。 DIMM將而不是移到內存通道中。我怎麼會這樣做呢?這個過程會是什麼?我是內核開發新手,可以使用指導。

我迄今發現:

  1. 從Linux內核保留內存,您可以指定memmap=nn[KMG]$ss[KMG]引導參數。此參數將特定內存標記爲從ss到ss + nn的內存保留區域。

  2. mmap可用於在一個地址PA建立進程的地址空間之間的映射對於LEN字節由文件描述符表示的存儲器對象法爾茲在偏移關閉對於len字節。

的保留內存之後,我假定一些字符設備驅動程序需要公開的保留內存給用戶空間應用程序?思考?


更新

還應當指出的是,需要被保留的DIMM將在它自己的專用內存通道,並沒有銀行或信道交織將被啓用。

+0

我看不出DIMM部分如何適合整個圖像。無論如何,不​​會像'/ dev/mem'那樣做嗎?我不知道保留的內存是否會被這樣的設備映射。 –

+0

@MargaretBloom關於DIMM的含義尚不清楚?我正在嘗試保留內核使用的其中一個DIMM上的所有內存。明白了嗎? '/ dev/mem'表示內核可以使用的所有內存,因此不一定代表我需要的內存。 – Jonathan

+0

如果標誌arg中有任何未使用的位,您可以通過'mmap'的新標誌來暴露它,即定義一個'MAP_RESERVED_DIMM'。 HugeTLBFS是另一種模式:一種特殊的文件系統,您可以將文件映射到映射關於後備內存的特殊映射。我不是Linux內部專家(只是一個感興趣的業餘愛好者),但是你也可以使用char或block設備。尤其是如果你只打算一次使用一個用戶空間進程,否則你如何讓他們找出哪些部分已經被映射了? –

回答

0

映射/dev/mem是簡單的方法。我以前做過這個。該mmapkernel 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; 
} 

您可能需要修改的唯一事情是valid_mmap_phys_addr_range(vma->vm_pgoff, size)。或者你可以編寫你自己的/dev/mem驅動程序。

+0

但是這不會**分配/保留**這些物理內存區域來阻止它們被用於其他任何事情,對嗎?如該評論所示,將它映射爲「VM_IO」會產生什麼影響? mmap(/ dev/mem)可能是一個完整答案的有用部分,但我並不認爲這部分是困難的部分。 –

+0

對內核使用'mem = xx' cmdline來僅使用部分內存。例如,傳遞'mem = 4G'將使內核僅使用4G以下的內存,然後可以使用修改的'/ dev/mem'驅動程序來映射4G以上的內存。 –

+0

這是一個有趣的想法,應該爲沒有交錯的OP設置工作。您確定'/ dev/mem'仍然可以訪問內核其餘部分認爲存在的範圍之外的內存嗎? –