加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

直接内存映射到DIMM

发布时间:2020-12-14 01:41:09 所属栏目:Linux 来源:网络整理
导读:假设您有2个DIMM插入Intel x86-64主板.所有存储器交错(存储体和通道)都被禁用. 我要做的是保留Linux内核(版本4.11.11)中其中一个DIMM的物理内存空间,并为应用程序公开该物理(保留)内存空间. DIMM不会在内存通道中移动.我怎么会这样做?这个过程是什么?我是
假设您有2个DIMM插入Intel x86-64主板.所有存储器交错(存储体和通道)都被禁用.

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

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

>要从Linux内核保留内存,您可以指定memmap = nn [KMG] $ss [KMG]启动参数.此参数将特定内存标记为从ss到ss nn的内存保留区域.
> mmap可用于在len字节的地址pa处的进程的地址空间与由len字节的偏移off处的文件描述符fildes表示的存储器对象之间建立映射.

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

更新

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

解决方法

映射/ dev / mem是一种简单的方法.我之前做过这个.从 kernel source开始的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_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_page_prot)) {
        return -EAGAIN;
    }
    return 0;
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读