直接内存映射到DIMM

Jon*_*han 5 memory memory-management x86-64 linux-kernel

假设您有2个DIMM插入Intel x86-64主板.所有存储器交错(存储体和通道)都被禁用.

我要做的是从Linux kernel(版本4.11.11)保留其中一个DIMM的物理内存空间,并为应用程序公开该物理(保留)内存空间.DIMM 不会在内存通道中移动.我怎么会这样做?这个过程是什么?我是内核开发的新手,可以使用指导.

到目前为止我发现了什么:

  1. 要从Linux内核保留内存,可以指定memmap=nn[KMG]$ss[KMG]引导参数.此参数将特定内存标记为从ss到ss + nn的内存保留区域.

  2. MMAP可用于在一个地址建立了进程的地址空间之间的映射 PA LEN字节由文件描述符表示的存储器对象法尔兹在抵消断开 LEN字节.

保留内存后,我假设需要一些字符设备驱动程序将保留内存暴露给用户空间应用程序?思考?


更新

还应注意,需要保留的DIMM将位于其自己的专用存储器通道中,并且不会启用存储体或通道交错.

小智 1

映射/dev/mem是最简单的方法。我以前做过这个。内核源码mmap的实现:

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;
}
Run Code Online (Sandbox Code Playgroud)

您可能需要修改的唯一内容是valid_mmap_phys_addr_range(vma->vm_pgoff, size). 或者您可以编写自己的驱动程序版本/dev/mem