关于从内核访问用户空间内存

时间:2017-12-08 13:59:33

标签: c linux memory linux-kernel xnu

我正在XNU内核上进行kext开发,有一个名为copyin的KPI函数及其朋友,类似于Linux内核中的copy_from_user

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

来自用户空间的数据有条目,所以我每次只需要阅读,除了我不需要在用户空间进程中对这个内存进行任何写操作,我列出了三种我能想到的方式,希望有人可以给我建议,我真的很感激!

  1. 在内核空间分配足够大小的可分页内存(IOMallocPageable),并调用copyin从用户空间复制整个数据
  2. Alloc还分配可分页内存,大小对于一个条目足够,使用copyin读取和处理然后再次读取到相同的内存
  3. 使用stac disable smap,直接从用户空间读取
  4. 第一种方式,如果我不写作,是否可以映射到相同的物理地图,所以不需要浪费内存? 哪种方式更有效率?

1 个答案:

答案 0 :(得分:0)

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

确保权限正确无误。

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