1

我在 XNU 内核做 kext 开发,有一个叫做 copyin 的 KPI 函数和它的朋友,类似于 Linux 内核的 copy_from_user

所以我大部分时间都在使用copyin,它在内核空间而不是相对易变的用户空间处理数据更安全,但有时我需要从用户空间处理大量内存(例如2MB),我只需要读取,可以吗成为直接访问用户空间内存的借口?(这会导致意想不到的问题吗?)

来自用户空间的数据有条目,所以我至少每次都需要读取,此外我不需要从用户空间进程对此内存进行任何写入,我列出了三种我能想到的方法,希望有人能给我的建议,我真的很感激!

  1. 在内核空间分配足够大小的可分页内存(IOMallocPageable),并调用 copyin 从用户空间复制整个数据
  2. alloc 也分配可分页内存,大小足够一个条目,使用copyin读取和处理然后再次读取到同一个内存
  3. 使用stac disable smap,直接从用户空间读取

第一种方式,如果我不写,那可以映射到相同的物理地图,所以不需要浪费内存吗?哪种方式效率更高?

4

1 回答 1

0

如果您有用户空间地址,则可以将其重新映射到内核 -IOMemoryDescriptor::withAddressRange与相关任务(进程任务)一起使用并将其映射到内核IOMemoryDescriptor::createMappingInTask

确保权限正确。

只是一个友好的提示 - stac/clac指令被上下文切换代码处理程序覆盖,您必须确保在复制阶段不会调用它。完成了 - 不是很有趣。

于 2017-12-09T20:09:35.503 回答