假设您有2个DIMM插入Intel x86-64
主板。所有内存交错(存储区和通道)都被禁用。
我要做的是保留Linux kernel
(版本4.11.11
)中某个DIMM的物理内存空间,并为应用程序公开该物理(保留)内存空间。 DIMM将不在内存通道中移动。我怎么会这样做?这个过程是什么?我是内核开发的新手,可以使用指导。
到目前为止我发现了什么:
要从Linux内核保留内存,您可以指定memmap=nn[KMG]$ss[KMG]
启动参数。此参数将特定内存标记为从ss到ss + nn的内存保留区域。
mmap 可用于在 len len 的地址处理地址空间之间建立映射 em>字节到文件描述符 fildes 表示的内存对象,偏移 off len 字节。
保留内存后,我假设需要一些字符设备驱动程序将保留内存暴露给用户空间应用程序?想法?
更新
还应注意,需要保留的DIMM将位于其自己的专用存储器通道中,并且不会启用存储体或通道交错。
答案 0 :(得分:0)
映射killing 2 3 4
是一种简单的方法。我之前做过这个。来自kernel source的/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;
}
。或者您可以编写自己的valid_mmap_phys_addr_range(vma->vm_pgoff, size)
驱动程序版本。