У меня есть ответ на вашу загадку :) Я искал повсюду в Интернете без особой помощи и, наконец, сам отладил.
Этот пост был хорошей отправной точкой для меня. Я хотел добиться чего-то похожего, я реализовал драйвер char с MMAP, чтобы сопоставить мою пользовательскую управляемую память с процессом пользовательского пространства. При использовании GDB ptrace PEEK вызывает access_process_vm () для доступа к любой памяти в вашем VMA. Это вызывает ошибку EIO, поскольку общий доступ не может получить PA вашей памяти. Оказывается, вы должны реализовать функцию доступа к этой памяти, реализуя .access вашей VMA vm_operations_struct. Ниже приведен пример:
//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;
}