私はあなたの難問に対する答えを持っています:)オンラインでどこでも検索し、最終的に自分でデバッグしました。
この投稿は私にとって良い出発点でした。同様の行で何かを達成したかったのですが、MMAP を使用して char ドライバーを実装し、カスタム マネージ メモリをユーザー空間プロセスにマップしました。GDB を使用する場合、ptrace PEEK は access_process_vm() を呼び出して、VMA 内のメモリにアクセスします。これにより、汎用アクセスがメモリの PA を取得できないため、EIO エラーが発生します。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;
}