AFAIK,ptrace 系统调用用于access_process_vm
从其他进程读取数据。但是,不同进程的地址空间是隔离的,这是如何实现的呢?
答案1
进程的地址空间确实是相互隔离的,但它们并没有与内核隔离。内核始终知道所有活动进程的内存布局。access_process_vm
工作原理如下:
- 它检索目标进程的内存管理信息(内核已经知道调用进程)
- 它确保它想要读取的页面固定在内存中(IE它们存在,不会完全释放,并且存在;这将导致任何调出的页面被读回)
- 它映射内核中的每个远程页面,并按照适当的方向复制所请求的数据。
在 64 位平台上,一般情况下 (IE该页不是 I/O 重映射页),最后一步中的映射依赖于内核的直接物理映射:内核可以直接访问所有物理内存。在 32 位平台上HIGHMEM
,这可能涉及创建特定的映射。 (后者是为什么kmap
在上面的最后一个链接中定义 的原因highmem.h
- 它只需要HIGHMEM
。)