首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直接内存映射到DIMM

直接内存映射到DIMM
EN

Stack Overflow用户
提问于 2017-08-31 22:51:08
回答 1查看 749关注 0票数 5

假设您已经将2个DIMM插入到Intel x86-64主板中。所有内存交织(银行和通道)被禁用。

我要做的是从Linux kernel (version 4.11.11)中为其中一个DIMM预留物理内存空间,并为应用程序公开该物理(保留)内存空间。DIMM不会在内存通道中移动。我怎么会这么做呢?这个过程会是什么?我对内核开发很陌生,可以使用指导。

到目前为止,我发现的是:

  1. 要从Linux内核中保留内存,可以指定memmap=nn[KMG]$ss[KMG]引导参数。此参数将特定内存标记为从ss到ss+nn的内存保留区域。
  2. https://linux.die.net/man/3/mmap可以用于在地址pa上的进程地址空间之间为len字节建立到文件描述符fildes表示的内存对象之间的映射。

在内存被保留之后,我假设需要某个字符设备驱动程序将保留的内存公开给用户空间应用程序?有什么想法?

更新

还应该注意的是,需要保留的DIMM将位于它自己的专用内存通道中,并且不会启用银行或信道交织。

EN

回答 1

Stack Overflow用户

发布于 2017-10-01 16:56:41

映射/dev/mem是一种简单的方法。我以前也这么做过。基于mmap核源实现

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45991131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档