我有你的难题的答案:) 我在没有太多帮助的情况下在网上到处搜索,最后自己调试了它。
这篇文章对我来说是一个很好的起点。我想以类似的方式实现某些目标,我已经使用 MMAP 实现了一个 char 驱动程序,以将我的自定义托管内存映射到用户空间进程。使用 GDB 时,ptrace PEEK 调用 access_process_vm() 来访问 VMA 中的任何内存。这会导致 EIO 错误,因为通用访问无法获取内存的 PA。事实证明,您必须通过实现 VMA 的 vm_operations_struct 的 .access 来实现该内存的访问功能。下面是一个例子:
//Below code needs to be implemented by your driver:
static struct vm_operations_struct custom_vm_ops = {
.access = custom_vma_access,
};
static inline int custom_vma_access(struct vm_area_struct *vma, unsigned long addr,
void *buf, int len, int write)
{
return custom_generic_access_phys(vma, addr, buf, len, write);
}
static int custom_generic_access_phys(struct vm_area_struct *vma, unsigned long addr,
void *buf, int len, int write)
{
void __iomem *maddr;
//int offset = (addr & (PAGE_SIZE-1)) - vma->vm_start;
int offset = (addr) - vma->vm_start;
maddr = phys_to_virt(__pa(custom_mem_VA));
if (write)
memcpy_toio(maddr + offset, buf, len);
else
memcpy_fromio(buf, maddr + offset, len);
return len;
}