我在 XNU 内核做 kext 开发,有一个叫做 copyin 的 KPI 函数和它的朋友,类似于 Linux 内核的 copy_from_user
所以我大部分时间都在使用copyin,它在内核空间而不是相对易变的用户空间处理数据更安全,但有时我需要从用户空间处理大量内存(例如2MB),我只需要读取,可以吗成为直接访问用户空间内存的借口?(这会导致意想不到的问题吗?)
来自用户空间的数据有条目,所以我至少每次都需要读取,此外我不需要从用户空间进程对此内存进行任何写入,我列出了三种我能想到的方法,希望有人能给我的建议,我真的很感激!
- 在内核空间分配足够大小的可分页内存(IOMallocPageable),并调用 copyin 从用户空间复制整个数据
- alloc 也分配可分页内存,大小足够一个条目,使用copyin读取和处理然后再次读取到同一个内存
- 使用stac disable smap,直接从用户空间读取
第一种方式,如果我不写,那可以映射到相同的物理地图,所以不需要浪费内存吗?哪种方式效率更高?