映射/dev/mem
是簡單的方法。我以前做過這個。該mmap
從kernel 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
驅動程序。
我看不出DIMM部分如何適合整個圖像。無論如何,不會像'/ dev/mem'那樣做嗎?我不知道保留的內存是否會被這樣的設備映射。 –
@MargaretBloom關於DIMM的含義尚不清楚?我正在嘗試保留內核使用的其中一個DIMM上的所有內存。明白了嗎? '/ dev/mem'表示內核可以使用的所有內存,因此不一定代表我需要的內存。 – Jonathan
如果標誌arg中有任何未使用的位,您可以通過'mmap'的新標誌來暴露它,即定義一個'MAP_RESERVED_DIMM'。 HugeTLBFS是另一種模式:一種特殊的文件系統,您可以將文件映射到映射關於後備內存的特殊映射。我不是Linux內部專家(只是一個感興趣的業餘愛好者),但是你也可以使用char或block設備。尤其是如果你只打算一次使用一個用戶空間進程,否則你如何讓他們找出哪些部分已經被映射了? –