我正在XNU内核上进行kext开发,有一个名为copyin的KPI函数及其朋友,类似于Linux内核中的copy_from_user
所以我在大多数时候都在使用copyin,它在内核空间处理数据更安全,而不是相对易变的用户空间,但有时我需要从用户空间处理相当大量的内存(例如2MB),我只需要阅读,这可以成为直接访问用户空间内存的借口吗? (这会导致意想不到的问题吗?)
来自用户空间的数据有条目,所以我每次只需要阅读,除了我不需要在用户空间进程中对这个内存进行任何写操作,我列出了三种我能想到的方式,希望有人可以给我建议,我真的很感激!
第一种方式,如果我不写作,是否可以映射到相同的物理地图,所以不需要浪费内存? 哪种方式更有效率?
答案 0 :(得分:0)
如果您有用户空间地址,则可以将其重新映射到内核 - 将nc -lk 9999
与相关任务(流程任务)一起使用,并使用IOMemoryDescriptor::withAddressRange
将其映射到内核。
确保权限正确无误。
只是一个友好的提示 - 上下文切换代码处理程序会覆盖IOMemoryDescriptor::createMappingInTask
/ stac
指令,您必须确保在复制阶段不会调用它。完成它 - 不是很有趣。